Java动态代理--CGLib动态代理

简介:
1
2
3
4
5
6
7
8
9
package  com.mzsx.gclib;
public  class  FunctionServerImp  {
     public  void  creatdDoc( int  count) {
         System.out.println( "创建了" +count+ "对象。。。。。。。" );
     }
     public  void  removeDoc( int  count) {
         System.out.println( "***了" +count+ "对象。。。。。。。" );
     }
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  com.mzsx.gclib;
public  class  Porformant {
     private  long  start;
     private  long  end;
     public   void  start(){
         System.out.println( "执行start。。。。。" );
         start =System.currentTimeMillis();
     }
                
     public  void  end(){
         end=System.currentTimeMillis();
         System.out.println( "耗时" +(end-start)+ "ms........" );
     }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package  com.mzsx.gclib;
import  java.lang.reflect.Method;
import  net.sf.cglib.proxy.Enhancer;
import  net.sf.cglib.proxy.MethodInterceptor;
import  net.sf.cglib.proxy.MethodProxy;
public  class  CGlibProxy  implements  MethodInterceptor {
     private  Enhancer enhancer= new  Enhancer();
     public  Object getProxy(Class clazz){
               
         enhancer.setSuperclass(clazz);
         enhancer.setCallback( this );
         return  enhancer.create();
     }
           
     @Override
     public  Object intercept(Object obj, Method method, Object[] arg,
             MethodProxy proxy)  throws  Throwable {
         Porformant porformant= new  Porformant();
         porformant.start();
               
         Object object=proxy.invokeSuper(obj, arg);
         porformant.end();
               
         return  object;
     }
           
}



1
2
3
4
5
6
7
8
9
10
package  com.mzsx.gclib;
public  class  CGlibTest {
     public  static  void  main(String[] args) {
         CGlibProxy cGlibProxy= new  CGlibProxy();
         FunctionServerImp functionServerImp=(FunctionServerImp)cGlibProxy.getProxy(FunctionServerImp. class );
         functionServerImp.creatdDoc( 10 );
         functionServerImp.removeDoc( 20 );
     }
       
}


对比JDK的AOP与CGlib的AOP:

1、JDK的AOP的proxy需要依赖与接口,而CGLib的APO不需要依赖接口;

2、JDK的AOP生成实例速度快,但是执行效率慢,CGLib刚好相反,是生成实例慢,执行效率快;

3、CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
   因为是继承,所以该类或方法最好不要声明成final 

动态代理的本质:

       用来实现对目标对象进行增强,最终表现为类,只不过是动态创建子类,不用手工生成子类。

动态代理的限制:

       只能在父类方法被调用之前或之后进行增强(功能的修改),不能在中间进行修改,要想在方法调用中增强,需要ASM(一个Java 字节码操作和分析框架)


本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/1367219

相关文章
|
2天前
|
Java API 开发者
解密Java反射机制与动态代理
解密Java反射机制与动态代理
8 0
|
12天前
|
设计模式 Java 测试技术
滚雪球学Java(25):动态代理
【4月更文挑战第14天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
12 0
滚雪球学Java(25):动态代理
|
16天前
|
监控 Java 数据安全/隐私保护
Java中的动态代理
Java中的动态代理
|
16天前
|
设计模式 缓存 算法
Java 的静态代理和动态代理
Java 的静态代理和动态代理
|
17天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
15 0
|
19天前
|
Java API Spring
Java基础教程(13)-Java中的反射和动态代理
【4月更文挑战第13天】Java反射机制允许程序在运行时获取类的信息并调用其方法。Class类是基础,提供获取类属性和方法的能力。通过Class对象,可以操作实例字段和方法,如getField、getDeclaredField等。动态代理是Java提供的创建接口实例的机制,其中JDK动态代理需目标类实现接口,而Cglib则可代理未实现接口的类。动态代理涉及Proxy和InvocationHandler接口。
|
22天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
2月前
|
Java API 开发者
Java代理模式——静态代理与动态代理
Java代理模式——静态代理与动态代理
27 1
|
2月前
|
监控 Java 程序员
java的动态代理如何实现
java的动态代理如何实现
25 0
|
3月前
|
设计模式 Java 程序员
Java动态代理
Java动态代理详解