JDK动态代理与CGLIB 动态代理

版权声明:欢迎转载,转载请再文章中标明转载链接地址 https://blog.csdn.net/u014692324/article/details/80794055

一、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

猜你喜欢

转载自blog.csdn.net/u014692324/article/details/80794055