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