//cglib代理
通过cglib创建代理类,好处是不要求我们的目标对象实现接口
1 准备架包
asm.jar
cglib.jar
2 man(要代理的对象)的编写
package com.aop.cglib;
public class Man {
private String name;
public Man()
{
}
public Man(String name)
{
this.name = name;
}
public void addMan()
{
System.out.println("add Man");
}
public void deltMan()
{
System.out.println("delete Man");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3 代理工厂CglibProxy的编写
package com.aop.cglib;
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 Object o;
/**
* 创建要代理的对象,并返回
* @param o
* @return
*/
public Object crateProxyObject(Object o)
{
this.o = o;
Enhancer eh = new Enhancer();
eh.setSuperclass(o.getClass());
eh.setCallback(this);
return eh.create();
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
Man man = (Man)o;
String name = man.getName();
Object result = "none";
if(name != null && !name.equals(""))
{
result = arg3.invoke(o, arg2);
}
System.out.println("result:"+result);
return result;
}
}
4 测试类TestProxy的编写
package com.aop.cglib;
public class TestProxy {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CglibProxy c = new CglibProxy();
Man man = (Man)c.crateProxyObject(new Man("1"));
man.addMan();
man.deltMan();
}
}
5 总结
根据程序可知:
如果man对象的name为空,则man的方法被拦截,不会执行
如果man对象的name不为空,则arg3.invoke(o, arg2)方法执行
分享到:
相关推荐
在这个问题中,我们遇到了两个关键的jar包:`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`。这两个jar包对于理解Spring框架的工作原理以及它们在实际应用中的作用至关重要。 首先,`spring-...
2. **AOP(面向切面编程)**:CGLIB常被用于实现AOP框架,例如Spring AOP。在Spring中,如果没有使用接口,那么默认会使用CGLIB来创建代理,以便在方法调用前后插入切面逻辑。 3. **性能优化**:由于CGLIB是基于...
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.net.sf.cglib-2.2.0.jar
CGLIB是一个强大的高性能的代码生成库,它在许多AOP框架中被用到,包括Spring。当Spring框架在进行AOP代理时,如果目标类没有实现接口,它会选择使用CGLIB来创建一个子类并动态地插入拦截器方法。CGLIB通过字节码...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)的实现中被使用,比如Spring AOP。CGLIB通过字节码操作技术,在运行时动态创建子类并增强方法。在Spring中,当目标对象不支持代理(如final类)...
- **AOP(面向切面编程)**:Spring AOP框架就利用CGLib实现对非接口类的代理,通过在目标方法前后插入增强代码,实现切面功能。 - **ORM(对象关系映射)**:Hibernate等ORM框架在无法使用JDK动态代理(即目标类...
在Java开发中,CGLib是一个不可或缺的工具,尤其在AOP(面向切面编程)和ORM(对象关系映射)等领域广泛应用。 `cglib-nodep-2.2.jar` 和 `cglib-2.2.0.jar` 是CGLib的两个不同版本。`nodep` 在这里表示 "no ...
在Spring框架中,CGLIB被广泛用于AOP(面向切面编程)代理。当目标对象不支持接口或者为了提高性能时,Spring会使用CGLIB代理来创建代理对象。`spring-cglib-repack-3.2.6.jar` 包含了CGLIB库的重新打包版本,可能包含...
当目标对象不支持接口时(即,它只是一个普通的Java类),Spring会利用CGlib创建目标对象的子类,并在子类中拦截方法调用,这样就能实现AOP(面向切面编程)的功能。例如,Spring的事务管理、缓存管理和性能监控等...
CGlib-nodep-2.1_3.jar 是一个与Java编程相关的库,主要用来扩展Java反射功能,特别是在处理面向切面编程(AOP)时。它是一个无依赖(nodep)版本,意味着它包含了所有必需的类,无需额外导入其他库,如ASM库。这个...
CGLIB是一个强大的代码生成库,常被用作Java代理机制,尤其在Spring AOP(面向切面编程)中。当Spring需要为目标对象创建代理以便实现方法拦截时,如果目标类没有实现接口,CGLIB就会派上用场,生成一个该类的子类,...
在Spring框架中,CGlib被用来实现AOP(面向切面编程)中的代理机制。当目标对象不支持接口(即为final类或者没有接口的类)时,Spring会使用CGlib来创建代理对象。通过这种方式,Spring能够注入切面逻辑,比如日志...
在Spring框架中,CGLIB主要被用于AOP(面向切面编程)的实现。当Spring需要对某个目标对象进行代理,但该对象不支持接口时,就会使用CGLIB。CGLIB通过字节码生成技术,为原始类创建一个子类,并在子类中拦截方法调用...
CGLIB是一个高性能的代码生成库,它在许多Java框架中被广泛使用,如Spring AOP。CGLIB能够生成子类,从而实现对目标类的代理。在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改...
aop的jar包: com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
CGlib是许多其他框架如Spring AOP和Hibernate的重要组成部分,它们依赖于CGlib来实现动态代理和代码增强功能。 **CGlib的基本原理** CGlib通过ASM库(一个Java字节码操控和分析框架)工作,它可以在运行时动态地...
而CGLIB则是一个代码生成库,它允许开发者在运行时动态创建子类,这对于面向切面编程(AOP)和扩展已有类的功能至关重要。当Hibernate与CGLIB结合使用时,可以实现对未声明为final的类的透明代理,进一步提升ORM的...
在Spring框架中,CGLIB主要被用来创建代理对象,特别是在没有实现接口的类上进行AOP(面向切面编程)操作。CGLIB通过生成子类并在子类的方法上插入拦截器来实现动态代理。"spring-cglib-repack-3.2.5.jar" 是CGLIB库...
CGLib,全称Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛使用,特别是在动态代理和AOP(面向切面编程)领域。这个库允许开发者在运行时动态创建类或者增强已有类的功能。在本篇...