Java cglib 动态代理机制

阳光穿透心脏的1/2处 2022-01-12 06:25 337阅读 0赞

上一篇讲过Java 的jdk动态代理机制 https://blog.csdn.net/k_young1997/article/details/91975889
它只能动态代理实现接口的类,如果没有实现接口,jdk是无法代理的。如果要实现类的动态代理可以使用cglib。
cglib 是一个强大的, 高效高质的代码生成库。

1、定义一个Programmer类

  1. package demo;
  2. public class Programmer {
  3. public void code() {
  4. System.out.println("I'm a Programmer,Just Coding.....");
  5. }
  6. }

2、定义一个Hacker类,实现方法拦截器接口

  1. package demo;
  2. import java.lang.reflect.Method;
  3. import net.sf.cglib.proxy.MethodInterceptor;
  4. import net.sf.cglib.proxy.MethodProxy;
  5. public class Hacker implements MethodInterceptor {
  6. @Override
  7. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  8. //在方法调用之前,加入自己的代码
  9. System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");
  10. //调用代理的方法
  11. proxy.invokeSuper(obj, args);
  12. //在方法调用之后,加入自己的代码
  13. System.out.println("**** Oh,what a poor programmer.....");
  14. return null;
  15. }
  16. }

3、生成动态代理对象,调用方法

  1. package demo;
  2. import net.sf.cglib.proxy.Enhancer;
  3. public class Test {
  4. public static void main(String[] args) {
  5. Hacker hacker = new Hacker();
  6. //cglib 中 用来创建动态代理
  7. Enhancer enhancer = new Enhancer();
  8. //设置要创建动态代理的类
  9. enhancer.setSuperclass(Programmer.class);
  10. // 设置回调,对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实行intercept()方法进行拦截
  11. enhancer.setCallback(hacker);
  12. Programmer p = (Programmer) enhancer.create();
  13. p.code();
  14. }
  15. }

cglib不仅能动态代理类,也可以动态代理接口,只需将 enhancer.setSuperclass() 换为 enhancer.setInterfaces(new Class[] {Interfaces.class}); 。 其中 new Class[] {} 为接口class对象的数组,在MethodInterceptor中根据自己的需要添加代码即可。

发表评论

表情:
评论列表 (有 0 条评论,337人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java动态代理——CGLIB

    1.使用场景:JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。

    相关 CGLIB动态代理

    一 说明 使用火车站卖票,使用CGLIB代理实现。 如果没有定义SellTickets接口,只定义了TrainStation(火车站类)。很显然JDK代理是无法使用了