浅谈java中的代理+即将工作一年感想
具体的代码如下
1.import java.lang.reflect.Method; 2.import net.sf.cglib.proxy.Enhancer; 3.import net.sf.cglib.proxy.MethodInterceptor; 4.import net.sf.cglib.proxy.MethodProxy; 5. 6.class RealSubject { 7. public void request() { 8. System.out.println("真实的请求"); 9. } 10. private void privateExample(){ 11. System.out.println("这个是私有方法不能被子类继承"); 12. } 13. 14.} 15. 16.public class MyMethodInterceptor implements MethodInterceptor { 17. 18. public Object intercept(Object object, Method method, Object[] args, 19. MethodProxy methodProxy) throws Throwable { 20. System.out.println(">>>MethodInterceptor start..."); 21. Object result = methodProxy.invokeSuper(object, args); 22. System.out.println(">>>MethodInterceptor ending..."); 23. return "hahahh"; 24. } 25. 26. public Object createProxy(Class targetClass) { 27. Enhancer enhancer = new Enhancer(); 28. enhancer.setSuperclass(targetClass); 29. enhancer.setCallback(new MyMethodInterceptor()); 30. return enhancer.create(); 31. } 32. 33. public static void main(String[] args) { 34. RealSubject target = new RealSubject(); 35. MyMethodInterceptor test = new MyMethodInterceptor(); 36. RealSubject proxyTarget = (RealSubject)test.createProxy(RealSubject.class); 37. proxyTarget.request(); 38. } 39.} ?
?cglib能实现对类的动态代理,产生的动态代理类是原始类,在上面的例子就是RealSubject的子类,那么又跑回到了java继承体系当中了,private方法 final方法是不能被子类继承和override的,所以这些方法是不会被动态代理的。像上面的方法privateExample(),就不会出现在main函数中的proxyTarget的方法列表中。
JDK动态代理和cglib动态代理的区别
1、JDK动态代理只能对接口实现动态代理,而cglib能对类实现动态代理
2、JDK动态代理生成动态代理类的速度或者说效率要比cglib快,但是生成后的动态代理类的效率则是cglib高,一般会高十倍以上,所以如果在Spring中使用动态代理,而Spring中的实例一般都是单例的,所以在Spring中生成动态代理类实例一般选用cglib比较好。这样生成的动态代理类的实例效率高。
闲扯几句:一般类的信息、常量信息会放在jvm内存中的方法区或者说是永久区,如果生成动态代理类过多的话,该区被占用的也就越多,有可能导致该区域的内存溢出(只是有可能,现实当中出现的几率非常小,就顺嘴提一句)。
1 楼 rlplyyrb 2 小时前 激情能持续多久呢? 2 楼 ddlgyq 2 小时前 rlplyyrb 写道激情能持续多久呢?不知道,目前还是蛮有激情的,努力坚持吧 3 楼 jinnianshilongnian 1 小时前 加油 4 楼 ddlgyq 1 小时前 jinnianshilongnian 写道加油
谢谢~共勉