CGLIB代理接口怎么写
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 著作权归作者所有。请勿转载和采集!