`
1028826685
  • 浏览: 939023 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

使用CGLIB生成代理

阅读更多
知识点


使用前提条件:


  /*
* 如果这个代理的类没有实现接口就不能使用JDK中的动态代理
* 这时需要使用第三方的.jar CGLIB实现代理
*
*/
  】

public class CGLIBProxy implements MethodInterceptor {
private Object targetObject;//代理的目标对象
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//该类用于生成代理对象
enhancer.setSuperclass(this.targetObject.getClass());//设置父类
enhancer.setCallback(this);//设置回调用对象为本身
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
return methodProxy.invoke(this.targetObject, args);
}
}
CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。




实现步骤:

第一步:在spring解压包中找到cglib-nodep-2.1_3.jar文件并导入

第四步:编写PersonServerCGLIB类
public class PersonServerCGLIB  {
private IPersonDao personDao;
private String name;

    public PersonServerCGLIB(){}

/*
* 通过构造器来注入依赖对象
*/
public PersonServerCGLIB(IPersonDao personDao, String name) {

this.name = name;
this.personDao = personDao;

}
public PersonServerCGLIB(String name){
this.name=name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public IPersonDao getPersonDao() {
return personDao;
}

// @Resource(name="mypersonDao")
// @Autowired
public void setPersonDao(IPersonDao personDao) {
this.personDao = personDao;
}
public void save() {

System.out.println("Test CGLIB Proxy");
}
}


第三步:编写CGLIB代理类

public class createCGLIBProxy implements MethodInterceptor{
/*
* 如果这个代理的类没有实现接口就不能使用JDK中的动态代理
* 这时需要使用第三方的.jar CGLIB实现代理
*
*/
private Object targeObject;

public Object createCGLIBProxy(Object targeObject)
{
this.targeObject=targeObject;
Enhancer enhancer=new Enhancer();
//设置父类  这里代理类需要继承这个父类 和JDK实现类似
enhancer.setSuperclass(this.targeObject.getClass());
enhancer.setCallback(this);

return enhancer.create();
}

public Object intercept(Object object, Method method, Object[] arg2,
MethodProxy methodProxy) throws Throwable {

Object object1=null;

PersonServerCGLIB personServer=(PersonServerCGLIB)this.targeObject;
if(personServer.getName()!=null || "".equals(personServer.getName()))
{
object1=methodProxy.invoke(this.targeObject, arg2);
}

return object1;
}
}

第四步 :编写单元测

@Test
public void TestCGLIBProxy()
{
createCGLIBProxy proxy=new createCGLIBProxy();
//PersonServer personServer=(PersonServer)proxy.createProxyInstance(new PersonServer("liyong"));

//这里转换为代理类而不是接口原因是这个类没有实现任何接口

PersonServerCGLIB personServer=(PersonServerCGLIB)proxy.createCGLIBProxy(new PersonServerCGLIB("liyong"));
personServer.save();
}
分享到:
评论

相关推荐

    cglib生成的代理class

    cglib生成的代理的class

    Spring框架中JDK动态代理和cglib动态代理

    CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下...

    cglib.jar以及cglib-src.jar

    在实体类没有实现任何接口的情况下,Hibernate会使用CGLIB生成代理对象,以便在保存或更新实体时能够自动跟踪属性的变化。 至于"aspectj",这通常指的是AspectJ,一个强大的AOP框架,它可以与CGLIB结合使用,提供更...

    浅谈JDK动态代理与CGLIB代理去区别

    在内存占用上,两者差别不大,但CGLIB生成的代理类可能略微增加内存负担。 在工具支持上,Spring框架对两者都有很好的支持。Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在...

    Jdk动态代理和cglib动态代理原理

    2. **Proxy类**:用于创建动态代理对象,通过`newProxyInstance()`静态方法,传入类加载器、接口数组和InvocationHandler实例来生成代理对象。 3. **实现过程**:首先,你需要定义一个接口,然后创建实现该接口的...

    cglib代理模式要使用的相关jar包

    CGLIB通过字节码技术生成代理类,能够在运行时动态创建子类并扩展目标对象,从而实现代理功能。这种代理方式相对于Java自带的JDK动态代理(基于接口的代理)来说,对目标类没有接口限制,更具有灵活性。 要使用...

    cglib动态代理介绍

    我们可以通过`Enhancer`创建一个增强器实例,然后设置回调函数(Callback),最后通过`enhancer.create()`方法生成代理对象。回调函数通常是`MethodInterceptor`,它包含了一个`intercept`方法,这个方法会在目标...

    java代理机制 JDK动态代理和cglib代理 详解

    - `Enhancer`是CGLIB的主要入口,它扮演了工厂的角色,通过它可以配置代理对象的行为,并生成代理子类。 - 使用Enhancer时,需要设置回调接口`Callback`,如`MethodInterceptor`,并指定被代理的目标类。 2. **...

    输出JDK和CGLib动态代理产生的class文件.zip

    - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这两个项目可以帮助我们深入了解JDK和CGLib动态代理的...

    CGLIB 和 JDK生成动态代理类的区别

    而CGLIB的使用稍微复杂一些,需要通过Enhancer类配置回调函数和目标对象,然后调用create()方法生成代理。 安全性方面,由于JDK动态代理遵循接口,所以在类型检查和编译时期就能发现问题。而CGLIB在运行时生成子类...

    jdk与cglib动态代理与底层实现

    - **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...

    简单实现Cglib子类代理

    - 创建Enhancer实例:Enhancer是Cglib的核心类,它负责生成代理对象。 - 设置被代理的目标对象:通过setSuperclass()方法设置目标类的Class对象。 - 设置回调机制:通过setCallback()或setCallbacks()方法设置回...

    cglib动态代理jar包

    3. 生成代理对象:通过Enhancer.create()方法,我们可以得到目标类的代理对象。这个代理对象是目标类的子类,它在运行时被动态创建。 4. 调用方法:通过代理对象调用目标类的方法,实际上会触发MethodInterceptor的...

    转载:cglib动态代理介绍(一)

    - CGlib生成的代理类会继承目标类,所以如果目标类声明为final,CGlib将无法创建代理。 - 对于包含final方法的目标类,CGlib也无法在这些方法上添加拦截器。 - 如果目标类中包含静态方法,CGlib代理不会影响静态方法...

    CGLib代理jar包

    使用CGLib代理的基本步骤如下: 1. 引入依赖:首先,你需要将这两个jar包引入到你的项目中,无论是Maven、Gradle还是传统的类路径管理方式。 2. 创建Enhancer对象:CGLib的代理功能主要通过Enhancer类来实现。...

    使用CGLIB的代理技术

    如果代理的目标类已经实现了接口,那么通常推荐使用JDK的动态代理,因为JDK动态代理不需要生成新的字节码,而是基于接口创建代理对象。 6. **CGLIB与Spring AOP**: 在Spring框架中,如果目标类没有实现接口,...

    cglib动态代理用到的两个包

    ASM库能够读取、修改和生成Class文件,这对于CGLib动态生成代理类至关重要。CGLib通过ASM解析类的字节码,然后在原有字节码的基础上插入新的字节码以实现动态增强。ASM的使用使得CGLib能够在运行时高效地创建和修改...

    Java 动态代理和Cglib代理(二)

    2. 使用Proxy.newProxyInstance()方法,传入目标接口、InvocationHandler实例以及类加载器,生成代理对象。 3. 通过代理对象调用接口方法,实际会触发InvocationHandler的invoke()方法。 然而,Java动态代理有一个...

    cglib动态代理相关包

    2. 创建Enhancer对象:这是CGlib的核心类,用于生成代理对象。 3. 设置回调函数:通过setCallback方法,设置方法拦截器,例如MethodInterceptor。 4. 生成代理对象:通过Enhancer.create()方法生成代理对象,这个...

    AOP之JDK动态代理和CGLib动态代理

    CGLib通过生成目标对象的子类来实现代理,它会动态地创建一个新的类,这个类继承自目标类,并覆盖其方法以插入切面逻辑。CGLib的优点是它可以代理任何类,无需目标对象实现接口,但相比JDK动态代理,它的运行效率较...

Global site tag (gtag.js) - Google Analytics