Java实现两种动态代理JDK与CGLIB
程序员文章站
2022-03-26 22:25:12
1. 作用AOP的拦截功能是由java中的动态代理来实现的。在目标类的基础上增加切面逻辑,生成增强的目标类。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。2. 分类JDK动态代理。CGLIB动态代理。3. 编码实现3.1 JDK接口public interface Target{ public void sava(String name);}public class TargetImpl implements T...
1. 作用
- AOP的拦截功能是由java中的动态代理来实现的。在目标类的基础上增加切面逻辑,生成增强的目标类。
- jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。
2. 分类
- JDK动态代理。
- CGLIB动态代理。
3. 编码实现
3.1 JDK
- 接口
public interface Target
{
public void sava(String name);
}
public class TargetImpl implements Target
{
public void sava(String name)
{
System.out.println("save " + name + " success");
}
}
public class Log
{
public void before()
{
System.out.println("开始记录日志...");
}
public void after()
{
System.out.println("日志记录完毕...");
}
}
public class Main
{
public static void main(final String[] args)
{
final TargetImpl target = new TargetImpl();
final Log log = new Log();
Target proxy = (Target) java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
new InvocationHandler()
{
public Object invoke(Object o, Method method, Object[] args) throws Throwable
{
log.before();
Object invoke = method.invoke(target, args);
log.after();
return invoke;
}
}
);
proxy.sava("cloud");
}
}
3.2 CGLIB
public class Target
{
public void login(String name)
{
System.out.println("Hello " + name);
}
}
public class Log
{
public void before()
{
System.out.println("开始记录日志...");
}
public void after()
{
System.out.println("日志记录完毕...");
}
}
public class Main
{
public static void main(String[] args)
{
// 1. 目标对象
final Target target = new Target();
// 2. 增强对象
final Log log = new Log();
// 3. 创建增强器
Enhancer enhancer = new Enhancer();
// 4. 设置父类
enhancer.setSuperclass(Target.class);
// 5. 设置回调
enhancer.setCallback(new MethodInterceptor()
{
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
{
log.before();
Object invoke = method.invoke(target, args);
log.after();
return invoke;
}
});
// 6. 创建代理对象
Target proxy = (Target) enhancer.create();
proxy.login("cloud");
}
}
4. 总结
JDK动态代理有一定局限性, 代理类和目标类都必须实现同一个接口。而CGLIB则没有这种局限性, CGLIB是让代理类继承目标类。
本文地址:https://blog.csdn.net/ZY4444444/article/details/109563890
上一篇: MySQL 操作数据库、数据表