今天看了一下Java的动态代码,先不说Java设计模式中的动态代理模式,本文就Java中的代理类,简单说一下,帮助理解一下,希望支持!
先看个动态代理的使用例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy {
public interface Ia {
public void print();
}
public class IaImpl implements Ia {
public void print() {
System.out.println("IaImpl");
}
}
public static void main(String[] args) {
final Object obj = new TestProxy().new IaImpl();
Ia instance = (Ia) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { Ia.class },
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke被调用");
return method.invoke(obj, null);
}
});
instance.print();// 调用这个方法的时候也调用了invoke方法
System.out.println("instance是哪个类的对象?——" + instance.getClass().getName());
}
}
输出结果:
invoke被调用
IaImpl
instance是哪个类的对象?——com.sun.proxy.$Proxy0
有时间大家会产生疑问 :invoke()方法是 怎么执行的?这里给解释一下(参考《深入理解JVM》中第9章的部分),由最后一个输出语句,我们可知,instance对象是代理类“Proxy”的class文件,反编译会得到:
..................
public final void print() throws{
try{
this.h.invoke(this, m2, null); //调用invoke方法
return;
}catch{
..................
}
}
.....................