CGLIB是一个基于ASM字节码操作库的代码生成类库,它可以在运行期动态生成新的类,用来扩展原有的类,同时也可以用来生成代理类。

CGLIB代理接口的写法与JDK动态代理略有不同,它不需要被代理类实现接口,因为CGLIB是通过继承被代理类来实现代理的。

下面给出一个CGLIB代理接口的示例:

public class UserService {

    public void addUser(String name, int age) {
        System.out.println("addUser method is called: name=" + name + ", age=" + age);
    }

    public void deleteUser(int id) {
        System.out.println("deleteUser method is called: id=" + id);
    }
}

public class UserServiceProxy implements MethodInterceptor {

    private Object target;

    public UserServiceProxy(Object target) {
        this.target = target;
    }

    // 创建代理对象
    public Object getProxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    // 代理方法
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before " + method.getName() + " method is called.");
        Object result = method.invoke(target, args);
        System.out.println("After " + method.getName() + " method is called.");
        return result;
    }
}

public class TestCglibProxy {

    public static void main(String[] args) {
        UserService userService = new UserService();
        UserServiceProxy proxy = new UserServiceProxy(userService);
        UserService proxyService = (UserService) proxy.getProxy();
        proxyService.addUser("Tom", 20);
        proxyService.deleteUser(1001);
    }
}

在上面的示例中,UserServiceProxy类实现了MethodInterceptor接口,并重写了intercept方法,在该方法中,先输出"Before",然后调用被代理对象的方法,最后输出"After",这样就完成了对被代理对象方法的增强。

在TestCglibProxy类中,先创建UserService对象,然后创建UserServiceProxy对象,并将UserService对象传入构造函数中,最后调用getProxy方法生成代理对象。通过代理对象调用方法时,会先执行代理方法intercept,然后再执行被代理对象的方法。


原文地址: https://www.cveoy.top/t/topic/Mgn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录