一、JDK动态代理
JDK的动态代理基于接口实现,所以被代理类一定要有实现接口
public interface IJDKTestDemo {
String getTopic(String prefix);
}
/**
* 功能描述:被代理类
*/
public class JDKTestDemoImpl implements IJDKTestDemo {
@Override
public String getTopic(String prefix) {
return "Hello " + prefix + "!";
}
}
代理类通过实现InvocationHandler
public class ProxyClass implements InvocationHandler {
private Object object;
public ProxyClass(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk proxy start...." + System.currentTimeMillis());
Object returnValue = method.invoke(object, args);
System.out.println("proxy result:" + returnValue);
System.out.println("jdk proxy end...." + System.currentTimeMillis());
return returnValue;
}
}
代理生成工厂
public class JDKProxyFactory {
public static <T> T getInstants(T obj) {
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new ProxyClass(obj));
}
}
二、CGLIB
需要引入jar
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</dependency>
代理类需要实现MethodInterceptor
public class CGLIBProxy<T> implements MethodInterceptor {
private Class<T> clazz;
public CGLIBProxy(Class<T> c) {
this.clazz = c;
}
public T createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return (T) enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib proxy start...." + System.currentTimeMillis());
Object returnValue = methodProxy.invokeSuper(o, args);
System.out.println("proxy result:" + returnValue);
System.out.println("cglib proxy end...." + System.currentTimeMillis());
return returnValue;
}
}
/**
* 功能描述:cglib动态代理工厂
*/
public class CGLIBProxyFactory {
public static <T> T getInstants(Class<T> clazz) {
return new CGLIBProxy<>(clazz).createProxy();
}
}
本文详细介绍了两种动态代理技术:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于有接口的场景;CGLIB则采用字节码增强技术,对指定类生成子类并进行方法拦截,适用于没有接口的场景。文章提供了具体的代码实例,展示了如何使用这两种代理方式。
1188

被折叠的 条评论
为什么被折叠?



