一、JDK动态代理
实现方式:通过反射类获取目标类的接口实现,进行拦截和扩展
优点:通过字节通过反射获取目标对象的方法进行拦截
缺点:目标对象类一定要实现接口
示例代码:
public interface UserService {
String getName();
}
public class UserServiceImpl implements UserService {
@Override
public String getName() {
return "hello world";
}
}
public class JDKProxyTest {
@Test
public void userServiceTest() {
UserService userService = JDKProxyFactory.getProxy(UserServiceImpl.class, new UserInvocationHandler(new UserServiceImpl()));
Assert.assertEquals("hello world", userService.getName());
}
}
二、CGLIB 动态代理
实现方式:通过字节码创建子类的方式,采取子类方法拦截父类的方法,实现切入。
优点:可以代理不需要实现接口的类,执行效率高
缺点:使用字节码创建对象,耗时比JDK久,对于final修饰的方法无法进行代理。
示例代码:
public class CglibProxyFactory {
/**
* @param tClass 目标代理对象类
* @param methodInterceptor 方法拦截对象
* @param <T>
* @return
*/
public static <T> T getProxy(Class<T> tClass, MethodInterceptor methodInterceptor) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(tClass);
enhancer.setCallback(methodInterceptor);
return (T) enhancer.create();
}
}
public class CglibProxyTest {
@Test
public void userServiceTest() {
UserService userService = CglibProxyFactory.getProxy(UserServiceImpl.class, new UserServiceInterceptor());
Assert.assertEquals("hello world", userService.getName());
}
}