JAVA代理,静态,动态详解( 四 )


ystem.out.println("methodProxy=" + methodProxy);
//执行目标方法对象
Object result = methodProxy.invokeSuper(o, objects);
ystem.out.println("——-after——-");
return result;
}
}
roxyFactory 代理工厂
ublic class ProxyFactory {
rivate static Enhancer enhancer = new Enhancer();
rivate static CglibProxy cglibProxy = new CglibProxy();
ublic static Object getProxy(Class cls) {
enhancer.setSuperclass(cls);
enhancer.setCallback(cglibProxy);
return enhancer.create();
}
ublic static void main(String[] args) {
UserDaoImpl userDao = (UserDaoImpl) getProxy(UserDaoImpl.class);
userDao.insert("zc");
}
}
思考
为什么这里面使用 invokeSuper() ,不使用 invoke()
1.Method method 是被代理对象的方法字节码对象 。
2.MethodProxy methodProxy 是代理对象的方法字节码对象 。
使用 MethodProxy 的好处:
不需要给代理对象传入被代理对象,效率更高 。不会出现死循环的问题 。
第一点查看代码就可以看出,对第二点进行讲解:
如何出现死循环的现象:
roxy.newProxyInstance(xxx, xxx,
ew InvocationHandler() {
[email protected]
ublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
……
//加入这一句
roxy.toString();
……
}
});
【JAVA代理,静态,动态详解】原因:代理对象方法的时候,都会经过拦截器方法 。因此,如果在拦截器中再调用代理对象的方法,就会再次进入拦截器,这样就形成了死循环 。