cglib动态代理和JDK动态代理
maven依赖
cglib动态代理需要jar包支持,CGLib采用了非常底层的字节码技术。
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
cglib和JDK动态代理
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。而JDK动态代理用的是反射,代理的是接口。
cglib示例
被代理类
public class Host {
public void rank(){
System.out.println("房东租房");
}
}
代理类
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGproxy implements MethodInterceptor {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy(Class targetClass){
if (targetClass == null) return null;
Enhancer enhancer = new Enhancer();
//设置代理父类
enhancer.setSuperclass(targetClass);
//设置代理回调方法
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前置增强");
Object result = method.invoke(target,objects);
System.out.println("后置增强");
return result;
}
}
测试
public class Demo {
public static void main(String[] args) {
Host host = new Host();
CGproxy cGproxy = new CGproxy();
cGproxy.setTarget(host);
Host proxy = (Host) cGproxy.getProxy(host.getClass());
proxy.rank();
}
}
JDK动态代理
被代理接口
public interface Rank {
public void rank();
}
被代理类
public class Host implements Rank{
public void rank() {
System.out.println("房东租房");
}
}
代理类
public class Proxyrank implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy(){
if (target == null) return null;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(proxy.getClass());
System.out.println("前置增强");
Object result = method.invoke(target,args);
System.out.println("后置增强");
return result;
}
}
测试
public class Demo {
public static void main(String[] args) {
Rank rank = new Host();
Proxyrank proxyrank = new Proxyrank();
proxyrank.setTarget(rank);
Rank rank1 = (Rank) proxyrank.getProxy();
rank1.rank();
}
}