本帖最后由 谢洋 于 2013-3-5 02:37 编辑
一、先明确两点:
1、所有代理类都是Poxy的子类;
2、代理类只能实现目标类的接口功能,并没拥有目标类所有功能,原因是java不支技多继承,它已继承了Proxy,不能再继承别的了
二、jvm生成的动态类必须实现一个或多个接口,为什么呢?
newProxyInstance(ClassLoader loader,Class<?>[] interfaces,invocationHandler h)
1、首先,要生成一个类,那么得想办法拿到一些构造函数;JVM正是通过这些接口得到这些接口的构造函数,然后通过这些构造函数生成一个新的类,
这就是传说中的代理类了;(这点我们可以去看原代码)
2、问题又来,即然这类是接口生成的,那它的方法体是怎么来的,怎么被调用?
a、当JVM通过代理类生成实例时,他会把这个实例关联的一个调用处理程序,
关键来了!!
b、当实例在调用方法时,他会自动调用关联到他的InocationHandler 对象的(调用处理程序)invoke方法,
同时他还会把对象(自己,proxy)和代表正在调用的方法的Method的 对象(method)以及方法的参数(args)传给invoke方法;
注意:Method是什么,我想大家都很清楚吧,Method都有了,不就是搞到方法了?
至于这个method怎么来的,我猜是实例通过反射,叫classloader搞来,因只有classloader才知道它把字节码加载到哪了,
这样子跟上面的参数就匹配了
c、因为invoke是我们复写的,还是看代码吧
public Object invoke(Object proxy,Method method,Object[] args)
throws Throwable {
//插入广告
advice.beforeMethod(method);
//获取目标方法的返回值
Object retVal = method.invoke(proxy,args);
advice.afterMethod(method);
//返回目标方法的返回值
return retVal;
}
/**这是张老描术代理类方法的内部
* 这个方法是代理类执行其某个方法时自动调用的,
* 相当于下面代码
* xxxMethod(args){
* return invoke(this,this.getClass.getMethod("xxxMethod"),args);
* }
*/
|