- 浏览: 23525 次
- 性别:
- 来自: 成都
最新评论
cglib 是一个强大的, 高效高质的代码生成库.
简单的使用方法
Enhancer中有几个常用的方法, setSuperClass和setCallback, 设置好了SuperClass后, 可以使用create制作代理对象了
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(EnhancerDemo.class);
enhancer.setCallback(new MethodInterceptorImpl());
EnhancerDemo demo = (EnhancerDemo) enhancer.create();
实现MethodInterceptor接口
private static class MethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Before invoke " + method);
Object result = proxy.invokeSuper(obj, args);
System.out.println("After invoke" + method);
return result;
}
}
intercept方法, Object result = proxy.invokeSuper(obj, args)调用了原来的方法, 在这个调用前后可以添加其他的逻辑, 相当于AspectJ的around
完整代码如下:
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 EnhancerDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(EnhancerDemo.class);
enhancer.setCallback(new MethodInterceptorImpl());
EnhancerDemo demo = (EnhancerDemo) enhancer.create();
demo.test();
System.out.println(demo);
}
public void test() {
System.out.println("EnhancerDemo test()");
}
private static class MethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.err.println("Before invoke " + method);
Object result = proxy.invokeSuper(obj, args);
System.err.println("After invoke" + method);
return result;
}
}
}
运行结果如下:
Before invoke public void EnhancerDemo.test()
EnhancerDemo test()
After invokepublic void EnhancerDemo.test()
Before invoke public java.lang.String java.lang.Object.toString()
Before invoke public native int java.lang.Object.hashCode()
After invokepublic native int java.lang.Object.hashCode()
After invokepublic java.lang.String java.lang.Object.toString()
EnhancerDemo$$EnhancerByCGLIB$$bc9b2066@1621e42
我们可以看到System.out.println(demo), demo首先调用了toString()方法, 然后又调用了hashCode,
生成的对象为EnhancerDemo$$EnhancerByCGLIB$$bc9b2066的实例, 这个类是运行时由cglib产生的
原文地址:http://www.cnblogs.com/kristain/articles/2092458.html
简单的使用方法
Enhancer中有几个常用的方法, setSuperClass和setCallback, 设置好了SuperClass后, 可以使用create制作代理对象了
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(EnhancerDemo.class);
enhancer.setCallback(new MethodInterceptorImpl());
EnhancerDemo demo = (EnhancerDemo) enhancer.create();
实现MethodInterceptor接口
private static class MethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Before invoke " + method);
Object result = proxy.invokeSuper(obj, args);
System.out.println("After invoke" + method);
return result;
}
}
intercept方法, Object result = proxy.invokeSuper(obj, args)调用了原来的方法, 在这个调用前后可以添加其他的逻辑, 相当于AspectJ的around
完整代码如下:
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 EnhancerDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(EnhancerDemo.class);
enhancer.setCallback(new MethodInterceptorImpl());
EnhancerDemo demo = (EnhancerDemo) enhancer.create();
demo.test();
System.out.println(demo);
}
public void test() {
System.out.println("EnhancerDemo test()");
}
private static class MethodInterceptorImpl implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.err.println("Before invoke " + method);
Object result = proxy.invokeSuper(obj, args);
System.err.println("After invoke" + method);
return result;
}
}
}
运行结果如下:
Before invoke public void EnhancerDemo.test()
EnhancerDemo test()
After invokepublic void EnhancerDemo.test()
Before invoke public java.lang.String java.lang.Object.toString()
Before invoke public native int java.lang.Object.hashCode()
After invokepublic native int java.lang.Object.hashCode()
After invokepublic java.lang.String java.lang.Object.toString()
EnhancerDemo$$EnhancerByCGLIB$$bc9b2066@1621e42
我们可以看到System.out.println(demo), demo首先调用了toString()方法, 然后又调用了hashCode,
生成的对象为EnhancerDemo$$EnhancerByCGLIB$$bc9b2066的实例, 这个类是运行时由cglib产生的
原文地址:http://www.cnblogs.com/kristain/articles/2092458.html
发表评论
-
Linux安装JDK15
2020-12-10 16:53 4471.下载64位JKD 15.0.1.tar.gz 地址:htt ... -
java内存分配分析/栈内存、堆内存
2016-03-23 18:31 472java内存分配分析 本文将由浅入深详细介绍Java内存分配 ... -
Java中equals和==的区别
2016-03-23 10:45 495一、java当中的数据类型和“==”的含义: 基本数据类型 ... -
jvm学习笔记--基本结构
2014-09-04 14:59 566主要来学习jvm的基本结构 知识点1:什么是java ... -
Java 内部类种类及使用解析
2014-07-03 18:24 1081Java中的内部类共分为四种: 静态内部类static ... -
Stack and Heap
2014-06-20 17:54 777Read a good article about Heap ... -
深入Java,初探JVM一
2014-06-19 09:39 456JAVA和JVM运行的原理,Jav ... -
java 值传递和引用传递详 解
2014-06-11 14:21 449最 近 遇到java 值传递和引用传递问题 ,做 了 一 个 ... -
jdk,jre关系
2013-02-18 17:06 624SDK(Software Develop Kit,软件开发工具 ... -
MySQL存储过程
2012-12-03 00:01 547MySQL存储过程 1.1 ... -
JAVA反射机制
2012-11-25 16:11 375看到一偏关于java反射机制的文章觉得不错,分享一下 JAVA ... -
JAVA读取键盘上输入信息
2012-11-13 22:05 740方法一:从控制台接收 ... -
内存溢出
2012-09-13 09:22 6851. Java Method Stack 栈溢出实验什么时候会 ... -
java中的IO整理
2012-08-30 22:33 710今天看天一篇关于IO的文章,感觉写得很不错,在这里贴出来,分享 ... -
java核心
2012-08-28 12:10 733学习了一段时间的java后,小有感触,结合网上的资料和大家分享 ... -
eclipse常用快捷
2012-08-19 01:18 646一、实用类快捷键 ...
相关推荐
例如,`net.sf.cglib.proxy.Enhancer`是CGLIB中最常用的类,它可以用来创建代理对象。同时,`net.sf.cglib.core.Predicate`和`net.sf.cglib.core.KeyFactory`等类也是实现代理功能的重要组件。 2. asm.jar:ASM是一...
因此,在实际开发中通常建议使用像 CGLIB 这样的高级抽象层,以简化字节码操作的过程。 #### 图1: CGLIB 库及其与其他框架的关系 该图展示了 CGLIB 库与一些流行的框架之间的关系,包括但不限于 Spring AOP 和 ...
在Spring框架中,CGLib被用作AOP代理的一个重要组件,特别是在没有实现接口的类上创建代理对象时,Spring会默认使用CGLib。 CGLib的工作原理是基于ASM库,ASM是一个字节码操作和分析框架,它可以用来动态生成类或...
下面我们将详细讲解Cglib代理的工作原理以及如何在实际项目中使用。 1. **Cglib代理原理**: - Cglib通过ASM库动态生成一个子类,这个子类继承自目标类,并重写其中的方法。 - 在生成的子类中,每个被代理的方法...
现在,我们来详细探讨如何简单模拟Spring框架中的CGLIB代理。要进行模拟,首先需要了解CGLIB代理的核心实现原理,包括代理类的生成、方法拦截和回调机制等。 1. 代理类的生成 CGLIB使用Enhancer类来生成代理对象。...
CGLib通过创建目标类的子类并在子类中拦截父类方法调用来实现这一目标。相比Java自带的InvocationHandler接口,CGLib的性能更优,因为它避免了反射的开销,而是直接通过字节码技术来生成和执行代理对象。 【版本...
在Spring中,如果你选择使用基于代理的事务管理,且目标类不实现接口,Spring就会默认使用CGLib来创建代理。通过代理,可以在方法调用前后插入额外的逻辑,如事务控制、性能监控等。 CGLib的使用通常涉及到以下几个...
在Java中,由于无法直接继承final类或者重写final方法,CGlib提供了一种解决方案,使得我们能够在运行时动态地扩展或修改类的行为。 CGlib的核心是ASM库,ASM是一个底层的Java字节码操纵和分析框架,可以用来动态...
在Cglib中,我们可以使用Enhancer类来创建代理对象,Enhancer提供了丰富的API来定制代理行为,比如设置回调函数(Callback)以定义拦截逻辑。 以下是一个简单的Cglib代理使用的例子: ```java import ...
2. **方法拦截器**:CGLIB使用`Enhancer`类来创建代理对象,并通过`Callback`接口实现方法拦截。`Callback`可以是`MethodInterceptor`,在方法调用前后执行自定义逻辑。 3. **字节码生成**:CGLIB通过ASM库生成新的...
2. **配置**:在Spring框架中,如果需要使用CGLIB进行AOP代理,需要在配置文件中启用CGLIB代理,例如在XML配置中添加 `<aop:aspectj-autoproxy/>` 或者在Java配置中使用 `@EnableAspectJAutoProxy(proxyTargetClass ...
在Spring中,如果没有使用接口,那么默认会使用CGLIB来创建代理,以便在方法调用前后插入切面逻辑。 3. **性能优化**:由于CGLIB是基于字节码操作,所以它的运行效率通常比使用反射更高。特别是在大规模对象创建...
1. **Enhancer**:CGLib中的核心类,用于创建代理对象。你可以通过`Enhancer`设置回调函数、目标对象、父类等,然后调用`enhance()`方法生成代理对象。 2. **Callback**:CGLib提供了一系列的回调接口,如`...
CGLib,全称Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛使用,特别是在动态代理和AOP(面向切面编程)领域。这个库允许开发者在运行时动态创建类或者增强已有类的功能。在本篇...
开发者在项目中引入此jar包,即可使用Cglib进行动态代理和类增强。 5. **cglib-nodep-3.3.0.jar**:此jar包与前者类似,但“nodep”意味着它不依赖于任何额外的库,如ASM。如果项目中已经包含了ASM库,那么可以选择...
下面是一个简单的CGLIB使用示例: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; ...
在Spring中,当目标类没有实现任何接口时,Spring会选择使用CGlib来创建代理,实现事务管理、日志记录等功能。此外,CGlib也被ORM框架如Hibernate用于动态生成实体类的代理,以便实现懒加载和其他优化策略。 总的来...
- 在CGLIB的源码中,`net.sf.cglib.proxy.Enhancer`是核心类,负责生成代理对象。它内部会使用ASM来创建子类,并通过`MethodProxy`对象来调用原方法。 - `net.sf.cglib.proxy.MethodInterceptor`接口定义了拦截器...
2. **接口回调**:对于接口,CGLib可以使用`Enhancer`类配合`Callback`接口来创建代理对象。这种方式更加灵活,但要求目标类必须实现至少一个接口。 关键组件和接口包括: - **Enhancer**:这是CGLib的主要入口点...