java中jdk代理和cglib代理使用步骤详解
前言
在Java中,代理是一种设计模式,它允许一个对象(代理)控制对另一个对象(真实对象)的访问。Java中的代理主要分为两种类型:JDK(Java Dynamic Proxy)代理和CGLIB(Code Generation Library)代理。
JDK 代理
JDK 代理是 Java 动态代理的一种实现方式,它是通过 Java 反射机制来实现的。JDK 代理要求被代理的类必须实现一个或多个接口,因为它是基于接口的代理。
使用步骤:
定义接口: 定义一个接口,它是被代理类和代理类都要实现的接口。
public interface MyInterface { void doSomething(); }
实现真实对象类: 实现接口的真实对象类。
public class RealObject implements MyInterface { public void doSomething() { System.out.println("RealObject is doing something."); } }
创建代理对象: 使用 Proxy.newProxyInstance()
方法创建代理对象。
RealObject realObject=new RealObject(); MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(RealObject.class.getClassLoader(), RealObject.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before invoking method."); Object result = method.invoke(realObject, args); System.out.println("After invoking method."); return result; } }); proxyInstance.doSomething();
CGLIB 代理
CGLIB 代理是通过生成被代理类的子类来实现的,因此不要求被代理类实现接口,它可以代理没有无参构造函数的类。
创建代理对象: 使用 Enhancer
类创建代理对象。
RealObject realObject=new RealObject(); //代理是子类型,目标是父类型 RealObject proxy = (RealObject) Enhancer.create(RealObject.class, new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("Before invoking method."); Object result = methodProxy.invokeSuper(o, args); // Object invoke = methodProxy.invoke(realObject, args); System.out.println("After invoking method."); return result; } }); proxy.doSomething();
附:JDK动态代理和CGLIB动态代理的区别
- 实现方式不同:JDK动态代理是基于接口的动态代理,而CGLIB动态代理是基于继承的动态代理。
- 代理对象类型不同:JDK动态代理代理的对象必须实现一个接口,生成的代理对象类型是接口类型;而CGLIB动态代理可以代理没有实现接口的类,生成的代理对象类型是目标对象的子类。
- 性能不同:JDK动态代理使用Java原生的反射机制进行操作,因此在生成代理对象时会消耗一定的时间,但在执行方法时,因为是接口代理,所以调用速度相对较快;而CGLIB动态代理使用ASM框架生成字节码,因此在生成代理对象时比JDK动态代理更快,但在调用方法时,因为要通过继承来实现代理,所以调用速度相对较慢。
- 引用的库不同:JDK动态代理不需要引用任何第三方库,因为它是Java自带的;而CGLIB动态代理需要引用cglib库和asm库。
- 对象的限制不同:JDK动态代理只能代理实现了接口的类;而CGLIB动态代理可以代理没有实现接口的类。
总结
到此这篇关于java中jdk代理和cglib代理使用步骤的文章就介绍到这了,更多相关java jdk代理和cglib代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring中事务管理方案和事务管理器及事务控制的API详解
这篇文章主要介绍了Spring中事务管理方案和事务管理器及事务控制的API详解,事务管理是指对事务进行管理和控制,以确保事务的正确性和完整性,事务管理的作用是保证数据库的数据操作的一致性和可靠性,需要的朋友可以参考下2023-08-08详解SpringBoot通过restTemplate实现消费服务
本篇文章主要介绍了详解使用RestTemplate消费spring boot的Restful服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-01-01SpringBoot Redis配置Fastjson进行序列化和反序列化实现
这篇文章主要介绍了SpringBoot Redis配置Fastjson进行序列化和反序列化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-10-10
最新评论