看了很多的jdk动态代理文章,都离不开这几个字:接口动态代理。
按照最简单的方式来看,就是在调用一个对象方法前后加一些处理代码,然后我们就很简单的想到编写一个代理类,传入需要代理的对象通过调用代理类的代理方法来实现“前后加一些处理代码”:
public class GoalClass{
public void goalClassMethod(){}
}
public class Proxy{
private GoalClass goalClass;
public GoalClass setGoalClass(GoalClass gc){
this.goalClass=gc;
}
public void proxyGoalClassMethod(){
//方法调用前的处理代码;
..........
//调用方法;
goalClass.goalClassMethod();
//方法调用后的处理代码;
...........
}
}
但是有个问题:不能给每个类都写一个代理类吧。
所以接口代理这个概念就抛出来了,通过实现对接口的代理,那么,所有这个接口的子类也就被代理了;?(这句话。。。。)
通过实现java.lang.reflect.InvocationHandler这个接口的invoke()方法,实现对方法的代理。
但是又一个问题蹦出来了:jvm怎么能识别不同的子类呢?
是通过java.lang.reflect.Proxy来实现的
通过java的ClassLoader来动态加载不同的子类,我们都知道java是解释型语言,所以在编译期间动态分辨出是哪个具体的子类。
具体是通过java.lang.reflect.Proxy.newProxyInstance(load,cl,hadle)来动态生成一个对象的代理。