读书人

浅谈java中的署理+即将工作一年感想

发布时间: 2013-07-09 09:50:47 作者: rapoo

浅谈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 写道加油
谢谢~共勉

读书人网 >编程

热点推荐