分享

cglib

 且看且珍惜 2014-12-10

cglib_Code Generation Library_简单使用

cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access.


cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime

定义切面类,继承MethodInterceptor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package aop;
  
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
  
import java.lang.reflect.Method;
  
public class AroundAdvice implements MethodInterceptor {
  
    public Object intercept(Object target, Method method,
                            Object[] args, MethodProxy proxy) throws java.lang.Throwable {
        System.out.println("执行目标方法之前,模拟开始事务 ...");
        // 执行目标方法,并保存目标方法执行后的返回值
        Object rvt = proxy.invokeSuper(target, new String[]{"被改变的参数"});
        System.out.println("执行目标方法之后,模拟结束事务 ...");
        return rvt + " 新增的内容";
    }
}

Chinese.java(不实现Person接口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package aop;
  
import org.springframework.stereotype.Component;
  
@Component
public class Chinese {
    public String sayHello(String name) {
        System.out.println("-- 正在执行 sayHello 方法 --");
        // 返回简单的字符串
        return name + " Hello , Spring AOP";
    }
  
    public void eat(String food) {
        System.out.println("我正在吃 :" + food);
    }
}

ChineseProxyFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package aop;
  
import net.sf.cglib.proxy.Enhancer;
  
public class ChineseProxyFactory {
  
    public static Chinese getAuthInstance() {
        Enhancer en = new Enhancer();
        // 设置要代理的目标类
        en.setSuperclass(Chinese.class);
        // 设置要代理的拦截器
        en.setCallback(new AroundAdvice());
        // 生成代理类的实例
        return (Chinese) en.create();
    }
}

测试方法:

1
2
3
4
5
6
7
@Test
public void test897() {
    Chinese chin = ChineseProxyFactory.getAuthInstance();
    System.out.println(chin.sayHello("孙悟空"));
    chin.eat("西瓜");
    System.out.println(chin.getClass());
}

运行结果:

>>>>>>>sayHello方法执行结果>>>>>>>>>

执行目标方法之前,模拟开始事务 ...

-- 正在执行 sayHello 方法 --

执行目标方法之后,模拟结束事务 ...

被改变的参数 Hello , Spring AOP 新增的内容


>>>>>>>eat方法执行结果>>>>>>>>>

执行目标方法之前,模拟开始事务 ...

我正在吃 :被改变的参数

执行目标方法之后,模拟结束事务 ...

class aop.Chinese$$EnhancerByCGLIB$$f92da8c6

从上面输出结果来看,CGLIB 生成的代理完全可以作为 Chinese 对象来使用,而且 CGLIB 代理对象的 sayHello()、eat() 两个方法已经增加了事务控制。。。

=======END=======


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多