JDK動態代理與CGLIB 動態代理
阿新 • • 發佈:2018-11-11
一、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());
}
}