大佬的博客传送门,优快云上好像有人转了,但是我没找到,所以这是博客园的
https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
这篇文章讲得很好了,只是有些地方有点不同的意见
1、InvocationHandler:
这个应该是动态代理类的Invocation handler(调用处理器)需要实现的接口,而不是动态代理类要实现的接口
2、文章中的 DynamicProxy 应该理解为一个Invocation Handler(调用处理器),而不应该理解成动态代理类
3、这里的proxy不是真实的类,应该是动态代理类,打印后可以发现它就是文章中所说的$Proxy0
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
个人见解,如有错误望指出。下面是一个Demo(编程思想上的):
(1)公共接口
interface Interface{
void f();
void g(String s);
}
(2)真实类,真正调用的是该类的方法
class RealObject implements Interface{
public void f() {
System.out.println("RealObject.f()");
}
public void g(String s) {
System.out.println("RealObject.g() "+s);
}
}
(3)一个InvocationHandler的实现,在动态代理上所做的调用都会重定向到这个invocation handler(调用处理器)上
class DynamicProxyHandler implements InvocationHandler{
private Object proxied;
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
/**
* proxy是动态代理对象
* method是真实对象的某个方法的Method对象
* args是调用真实对象方法时接受的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("proxy:"+proxy.getClass());
System.out.println("method:"+method);
System.out.println("args:"+args);
if(args != null)
for(Object arg:args)
System.out.println(" "+arg);
return method.invoke(proxied, args);
//调用method的invoke方法实际就是执行proxied对象对应的方法
}
}
//这里的输出:
//proxy:class psl.rtti.study.$Proxy0
//method:public abstract void psl.rtti.study.Interface.f()
//args:null
//proxy:class psl.rtti.study.$Proxy0
//method:public abstract void psl.rtti.study.Interface.g(java.lang.String)
//args:[Ljava.lang.Object;@6bc7c054
// hahahahahaha
(4)
class SimpleDynamicProxy{
public static void consumer(Interface iface){
i.f();
i.g("hahahahaha");
}
public static void main(String[] args){
RealObject real = new RealObject();
InvocationHandler handler = new DynamicProxyHandler(real);
/*
* Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces,
* InvocationHandler h)
* 该方法返回一个动态代理对象,该对象实现了第二个参数中的接口
* 使用动态代理对象调用代理的方法时,会被重定向到第三个参数的InvocatonHandler h上
* 并自动调用 h中的invoke方法
*/
Interface proxy = (Interface)Proxy.newProxyInstance(RealObject.class.getClassLoader(),
new Class[] {Interface.class}, handler);
System.out.println(proxy.getClass().getName());
consumer(proxy);
}
}
//这里的部分输出:
//psl.rtti.study.$Proxy0
//RealObject.f()
//RealObject.g() hahahahahaha