关于动态代理的问题
java吧
全部回复
仅看楼主
level 12
package com.lib.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject
{
public void doSomething(String mark);
}
class RealSubject implements Subject
{
public void doSomething(String mark)
{
System.out.println( "call doSomething()"+mark );
}
}
class ProxyHandler implements InvocationHandler
{
private Object tar;
//绑定委托对象,并返回代理类
public Object bind(Object tar)
{
this.tar = tar;
//绑定该类实现的所有接口,取得代理类
return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
tar.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy , Method method , Object[] args)throws Throwable//不依赖具体接口实现
{
Object result = null;//被代理的类型为Object基类
//这里就可以进行所谓的AOP编程了
//在调用具体函数方法前,执行功能处理
System.out.println("before");
result = method.invoke(tar,args);
//在调用具体函数方法后,执行功能处理
System.out.println("after");
return result;
}
}
public class Try
{
public static void main(String args[])
{
ProxyHandler proxy = new ProxyHandler();
//绑定该类实现的所有接口
Subject sub = (Subject) proxy.bind(new RealSubject());
sub.doSomething("just");
}
}
2018年05月23日 07点05分 1
level 12
这里跑main方法之后的结果如下:
before
call doSomething()just
after
2018年05月23日 07点05分 2
可能上面格式不好看。代码截图贴在楼下了 麻烦各位帮看看呢
2018年05月23日 07点05分
level 12
这里我好奇的地方是在哪里调用了ProxyHandler的invoke方法呢???还是说是ProxyHandler实现了InvocationHandler接口起的作用呢??
2018年05月23日 07点05分 3
level 12
可有大佬知道??
2018年05月23日 07点05分 4
level 12
2018年05月23日 07点05分 5
除了导类以外的所有代码
2018年05月23日 07点05分
level 12
???可有人玩过这个?
2018年05月23日 08点05分 6
level 12
调试了 代理对象的dosomething方法直接调到了invoke内部。
2018年05月23日 08点05分 8
level 1
前两天看到了,简单了解了一波。首先
Proxy.newProxyInstance(被代理类的类加载器,被代理类实现的所有接口组成的Object数组,一个实现了newInstance接口的类(其中要实现invoke方法)),这就是代理类的参数。而这里使用了this,而当前类实现了newInstance接口,所以当前类的invoke方法。会在被代理类每次调用方法时,被执行。所以调用方法会打印before 执行mothod.invoke after。稍微看了一下,没看源码
2018年05月23日 08点05分 9
第二个参数是其实现的所有接口的Class对象数组,tar.getClass.getInstances可以获得所有的接口Class组成的数组。只是会依葫芦画瓢的程度,希望能有帮助
2018年05月23日 08点05分
丢人,名字没记住,当前类实现的是InvocationHandler
2018年05月23日 08点05分
@遂想→如愿 之前我有想过如果invocationhandler是一个类 那么在他的构造函数中调用invoke方法可以实现。但是要是是一个接口的话能够怎么实现呢?
2018年05月23日 09点05分
@眸明映月💦 我感觉就是使用invoke(prixy,method,args)这个方法,替换掉了被代理类的方法(当然这个方法不固定,调用了哪个方法就是那个方法)。
2018年05月23日 09点05分
level 9
通过代理类,这个类继承了proxy,在代理类内部通过this.h.invoke实现真实方法,proxy类里有invocationHandlet属性,构造proxy的同时会给属性赋值,也就是自定义的类。同时实现invoke方法。源码里都有的。
2018年05月23日 09点05分 10
嗯呢 我理解的也差不多这样了
2018年05月23日 10点05分
level 12
嗯呢 看了一下源码,newinstance方法会生成一个继承了proxy的类$proxy0,并且将$proxy0实例化,这里就会调用proxy的构造函数,proxy的构造函数会把传入的invocationhandler的实例赋给proxy的一个变量h,然后再$proxy0的dosomething方法中会调用h的invoke方法。具体怎么实现把invoke加入dosomething方法中的目前不关心了,应该是在生成$proxy0的方法里面实现的
2018年05月23日 09点05分 11
level 14
萌新瑟瑟发抖[啊]
2018年05月23日 10点05分 12
10级萌新吗??
2018年05月23日 10点05分
@眸明映月💦 签到的
2018年05月23日 10点05分
1