`
wangcheng
  • 浏览: 1466461 次
  • 性别: Icon_minigender_1
  • 来自: 青岛人在北京
社区版块
存档分类
最新评论

CGLIB - dynamic bytecode generation

    博客分类:
  • java
阅读更多

CGLIB (Code Generation Library) 是一个动态字节码生成库, 基于ASM, 使用时需要asm.jar。(Groovy也是使用ASM来生成java的字节码)

使用java的java.lang.reflect.Proxy只能针对接口生成代理; 而使用CGLIB则可以针对类生成代理. CGLIB原理是在运行时动态生成一个被代理类的子类。

下面的例子使用CGLIB, 对服务层对象的方法进行拦截,实现一个类似的AOP.

java 代码
  1. public class ProductService implements ServiceInterface<ProductDTO> {   
  2.        
  3.     public void doDelete(Integer id) {   
  4.         productDAO.delete(id);   
  5.     }   
  6.   
  7.     public void doSave(ProductDTO dto) {   
  8.         productDAO.saveOrUpdate(dto);   
  9.     }   
  10.   
  11.     public void doUpdate(ProductDTO dto) {   
  12.         productDAO.saveOrUpdate(dto);   
  13.     }   
  14.   
  15.     public ProductDTO getObject(Integer id) {   
  16.         return productDAO.getProduct(id);   
  17.     }   
  18. }  

ProductService是一个简单的服务层类, 在ServiceInterface中定义了DAO对象和一些方法。

如果服务层对象有事物方面的需要, 就使用Interceptor来增强. 需要实现 net.sf.cglib.proxy.MethodInterceptor 接口.

java 代码
  1. public class ServiceMethodInterceptor implements MethodInterceptor {   
  2.        
  3.     private static final Logger logger = Logger.getLogger(ServiceMethodInterceptor.class);   
  4.   
  5.     public Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {   
  6.   
  7.         if (method == null || StringUtils.isBlank(method.getName())) {   
  8.             logger.error("Method is null!");   
  9.             return null;   
  10.         }   
  11.         String methodName = method.getName();   
  12.            
  13.         //所有以do开头的方法,使用updateTransaction   
  14.         if (methodName.startsWith("do")) {   
  15.             return updateTransaction(o, method, args, proxy);   
  16.         }   
  17.            
  18.         //所有以get开头的方法,使用queryTransaction   
  19.         if (methodName.startsWith("get")) {   
  20.             return queryTransaction(o, method, args, proxy);   
  21.         }   
  22.            
  23.         return proxy.invokeSuper(o,args);   
  24.     }   
  25.        
  26.     private Object queryTransaction(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {   
  27.   
  28.         Object result = null;   
  29.         try{   
  30.             result = proxy.invokeSuper(o,args);   
  31.         } catch (Exception e) {   
  32.             logger.fatal(e);   
  33.         }  finally {   
  34.             TransactionBO.endSession();   
  35.         }   
  36.            
  37.         return result;   
  38.     }   
  39.        
  40.     private Object updateTransaction(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {   
  41.            
  42.         Object result = null;   
  43.         try{   
  44.             TransactionBO.beginTransaction();   
  45.             result = proxy.invokeSuper(o,args);   
  46.             TransactionBO.commit();   
  47.         } catch (Exception e) {   
  48.             TransactionBO.rollback();   
  49.         }  finally {   
  50.             TransactionBO.endSession();   
  51.         }   
  52.            
  53.         return result;   
  54.     }   
  55.   
  56. }  
java 代码
  1. public class ServiceFactory {   
  2.        
  3.     public static <T extends ServiceInterface> T getServiceInstance(Class<T> clazz) {   
  4.         Enhancer enhancer = new Enhancer();   
  5.         enhancer.setSuperclass(clazz);   
  6.         enhancer.setCallback(new ServiceMethodInterceptor());   
  7.         return (T) enhancer.create();   
  8.     }   
  9. }  

使用ProductService时,需要由ServiceFactory创建

java 代码
  1. public static void main(String[] args) {   
  2.     ProductService productService = ServiceFactory.getServiceInstance(ProductService.class);   
  3.     productService.doSave(...);   
  4.     productService.getObject(...);   
  5. }  

实际上这里使用的是CGLIB生成的ProductService的子类.  Enhancer生成的子类都实现了net.sf.cglib.proxy.Factory接口, 可以通过Factory.getCallbacks()取回MethodInterceptor

参考

http://cglib.sourceforge.net/

http://asm.objectweb.org/

http://www.iteye.com/topic/98178

http://www.blogjava.net/calvin/archive/2005/11/28/21741.html

http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/index.html

分享到:
评论

相关推荐

    开发工具 cglib-3.2.4

    开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4...

    cglib-nodep-3.2.4-API文档-中文版.zip

    赠送jar包:cglib-nodep-3.2.4.jar; 赠送原API文档:cglib-nodep-3.2.4-javadoc.jar; 赠送源代码:cglib-nodep-3.2.4-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.2.4.pom; 包含翻译后的API文档:cglib-...

    CGLIB需要的asm-2.2.3.jar和cglib-nodep-2.2.jar

    CGLIB-nodep-2.2.jar是CGLIB的一个无依赖版本,"nodep"即"no dependency"的缩写,意味着这个版本的CGLIB不包含任何外部依赖,只包含了CGLIB自身的核心功能。这对于那些希望减少项目依赖和减小应用体积的开发者来说...

    spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.1.jar

    在这个问题中,我们遇到了两个关键的jar包:`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`。这两个jar包对于理解Spring框架的工作原理以及它们在实际应用中的作用至关重要。 首先,`spring-...

    JavaEE源代码 cglib-2.1.3

    JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.ja及ck-2.5.1.jar

    "spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring源码阅读环境中常用的依赖包,它们各自承担着不同的功能。 首先,我们来看"CGLIB"...

    cglib-nodep-2.2.3.jar

    cglib-nodep-2.2.3.jar cglig 库文件

    cglib-nodep-3.1-API文档-中英对照版.zip

    赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...

    cglib-nodep-3.1-API文档-中文版.zip

    赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...

    spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.5.1.jar

    `spring-cglib-repack-3.2.4.jar`包含了CGLIB(Code Generation Library)库的重新打包版本。CGLIB是一个强大的高性能的代码生成库,它在许多AOP框架中被用到,包括Spring。当Spring框架在进行AOP代理时,如果目标类...

    强势推送cglib-full-2.0及cglib-full-2.0.2

    在这里,我们有两个版本,即cglib-full-2.0和cglib-full-2.0.2。通常,更新的版本修复了旧版本中的bug,可能提供了新的特性和性能优化。从2.0到2.0.2,可能会包含一些稳定性改进和兼容性调整。 5. **使用步骤** -...

    cglib-full-2.0.2.jar

    cglib-full-2.0.2.jar cglib-full-2.0.2.jar cglib-full-2.0.2.jar

    JavaEE源代码 cglib-2.2_beta1

    JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1...

    cglib-2.2.0.jar cglib-nodep-2.2.jar

    `cglib-nodep-2.2.jar` 和 `cglib-2.2.0.jar` 是CGLib的两个不同版本。`nodep` 在这里表示 "no dependencies",即无依赖版,意味着这个版本的CGLib不包含对其他库的依赖,开发者需要自行引入必要的依赖。而`cglib-...

    spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jarspring-cglib-repack

    在给定的标题和描述中,提到了两个关键的jar包:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个文件对于理解Spring框架的内部机制以及如何在IDEA中构建Spring源码至关重要。 首先...

    cglib-nodep-2.1_3.jar

    CGlib-nodep-2.1_3.jar 是一个与Java编程相关的库,主要用来扩展Java反射功能,特别是在处理面向切面编程(AOP)时。它是一个无依赖(nodep)版本,意味着它包含了所有必需的类,无需额外导入其他库,如ASM库。这个...

    spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...

    hibernate-cglib-repack-2.1_3.jar

    hibernate-cglib-repack-2.1_3.jar

    spring-cglib-repack-3.1.jar,spring-objenesis-repack-2.1.jar

    首先,"spring-cglib-repack-3.1.jar"是一个针对CGLIB(Code Generation Library)的打包版本,用于在运行时动态创建Java类的子类。CGLIB是一个强大的代码生成库,常被用作Java代理机制,尤其在Spring AOP(面向切面...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    然而,有时候在导入Spring项目时,可能会遇到一些问题,例如标题中提到的"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个jar包的缺失。这些jar包对于Spring框架的正常运行至关重要,因为...

Global site tag (gtag.js) - Google Analytics