cglib动态代理和JDK动态代理
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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)