cglib初步使用代理

业务类:

public class UserServiceImpl {
    public void add() {
        System.out.println("add方法!");
    }
    public final void delete() {//final方法不能被代理,直接输出,不会输出代理中打印语句
        System.out.println("delete方法!");
    }
}

代理类执行的逻辑:

import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class MyMethodInterceptor implements MethodInterceptor  {
    public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
        System.out.println("before:"+ method);

        Object resultInfo = proxy.invokeSuper(obj, arg);

        System.out.println("after:"+ method);
        return resultInfo;
    }
}

测试:

public class CglibProxyTest {
//  使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,
//  底层采用asm字节码生成框架生成代理类的字节码,
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();

        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(new MyMethodInterceptor());

        UserServiceImpl userService = (UserServiceImpl) enhancer.create();
        userService.add();
    }
//  代理对象的生成过程由Enhancer类实现,大概步骤如下:
//  1、生成代理类Class的二进制字节码;
//  2、通过Class.forName加载二进制字节码,生成Class对象;
//  3、通过反射机制获取实例构造,并初始化代理类对象。

//  1、代理类UserService$$EnhancerByCGLIB$$394dddeb继承了委托类UserSevice,且委托类的final方法不能被代理;
//  2、代理类为每个委托方法都生成两个方法,以add方法为例,一个是重写的add方法,一个是CGLIB$add$0方法,该方法直接调用委托类的add方法;
//  3、当执行代理对象的add方法时,会先判断是否存在实现了MethodInterceptor接口的对象cglib$CALLBACK_0,如果存在,则调用MethodInterceptor对象的intercept方法:

}

jdk和cglib动态代理实现的区别
1、jdk动态代理生成的代理类和委托类实现了相同的接口;
2、cglib动态代理中生成的字节码更加复杂,生成的代理类是委托类的子类,且不能处理被final关键字修饰的方法;
3、jdk采用反射机制调用委托类的方法,cglib采用类似索引的方式直接调用委托类方法;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用CGLIB创建代理对象的主要步骤如下: 1. 定义一个类,并实现一个接口(或者继承一个类)作为目标类。 2. 在目标类中,定义一个方法。 3. 创建一个MethodInterceptor对象,用于拦截目标方法的执行。 4. 使用Enhancer类创建代理对象,设置目标类、MethodInterceptor对象和其他相关参数。 5. 调用代理对象的方法,触发MethodInterceptor对象的intercept方法。 6. 在intercept方法中,可以通过MethodProxy对象调用目标方法,并在目标方法执行前后添加一些操作。 下面是一个示例代码: ```java public interface UserService { void addUser(String name, String password); } public class UserServiceImpl implements UserService { @Override public void addUser(String name, String password) { System.out.println("Add user: " + name); } } public class UserServiceInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before method: " + method.getName()); Object result = proxy.invokeSuper(obj, args); System.out.println("After method: " + method.getName()); return result; } } public class ProxyDemo { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(UserServiceImpl.class); enhancer.setCallback(new UserServiceInterceptor()); UserService userService = (UserService) enhancer.create(); userService.addUser("Alice", "123456"); } } ``` 运行上述代码,输出结果如下: ``` Before method: addUser Add user: Alice After method: addUser ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值