java中jdk代理和cglib代理使用步骤详解
作者:山河亦问安
这篇文章主要给大家介绍了关于java中jdk代理和cglib代理使用步骤的相关资料,JDK代理和CGLIB是Java中两种常见的代理实现方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
前言
在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代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!