1. 程式人生 > >JDK動態代理與CGLIB 動態代理

JDK動態代理與CGLIB 動態代理

一、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()); } }

git地址:https://gitlab.com/xiaoc/proxy-Impl.git