当前位置:首页 > CN2资讯 > 正文内容

jdk动态代理和cglib动态代理

1天前CN2资讯


前言:动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发。


jdk动态代理

下面将代码实例展示

package cn.mode.proxy; /** * 接口类 * @author zzh * */ public interface People { void say(int i); }package cn.mode.proxy; /** * 实现类 * @author zzh * */ public class Girl implements People { @Override public void say(int i) { if (i == 1) { System.out.println("我在吃饭"); } else { System.out.println("我什么事都没做"); } } }package cn.mode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Date; /** * 代理类 * @author zzh * */ public class SayHandler implements InvocationHandler { private Object obj; //构造方法传入代理 public SayHandler(Object obj) { this.obj = obj; } public SayHandler() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始代理,时间:" + new Date()); Object result = method.invoke(obj, args); System.out.println("代理结束"); return result; } }package cn.mode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 测试类 * @author zzh * */ public class Test { public static void main(String[] args) { People people = new Girl(); //代理类 InvocationHandler handler = new SayHandler(people); //代理对象 People proxy = (People) Proxy.newProxyInstance(People.class.getClassLoader(), new Class[]{People.class}, handler); proxy.say(1); } }

输出:
开始代理,时间:Sun Mar 27 21:24:58 CST 2016
我在吃饭
代理结束

jdk动态代理只能代理一个或多个接口,如果需要动态代理具体类或抽象类,可以使用cglib动态代理。


cglib动态代理

看一个例子

package cn.mode.proxy.cglib; public class People { public void say() { System.out.println("吃吃"); } }package cn.mode.proxy.cglib; public class Girl extends People { @Override public void say() { System.out.println("我在吃饭"); } }package cn.mode.proxy.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class PeopleProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class<?> clazz){ //设置需要创建子类的类 enhancer.setSuperclass(clazz); //回调 enhancer.setCallback(this); //通过字节码技术动态创建子类实例 return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("代理前"); Object object = proxy.invokeSuper(obj, args); System.out.println("代理后"); return object; } }package cn.mode.proxy.cglib; public class Test { public static void main(String[] args) { PeopleProxy proxy = new PeopleProxy(); People people = (People) proxy.getProxy(Girl.class); people.say(); } }

输出:
代理前
我在吃饭
代理后

对比

  • jdk的动态代理使用的反射,cglib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用。
  • jdk动态代理创建的时间的比cglib快,cglib的创建后的使用效率比较高,对于创建后使用频率较多的建议使用cglib。
  • 由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

    • 你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/24174.html

      分享给朋友:

      “jdk动态代理和cglib动态代理” 的相关文章

      云计算技术在犬类健康管理中的应用与创新

      云计算服务在犬类健康管理中的应用 在现代社会中,科技的发展为我们的生活带来了许多便利,尤其是云计算技术提供了不可或缺的支持。在犬类健康管理中,云计算的应用同样发挥着至关重要的作用。这一技术不仅能帮助宠物主人更好地管理爱犬的健康状况,还可以提高宠物医院的服务效率和医疗水平。 首先,云计算技术的核心在于...

      远程VPS优选指南:高效管理虚拟专用服务器的最佳实践

      随着远程工作的普及和数字化转型的加速,远程VPS(虚拟专用服务器)逐渐成为许多企业和个人的首选工具。VPS通过虚拟化技术,让我们能够在一台物理服务器上同时运行多个独立的操作系统,这种灵活性使得用户能够像管理独立服务器那样,远程登录和管理自己的虚拟环境。每天都有更多的人意识到,拥有一个VPS可以为他们...

      HostYun:高性价比VPS服务的理想选择

      HostYun,最早被称作主机分享,成立于2008年,专注于提供性价比极高的VPS服务。在众多IDC品牌中,HostYun凭借其低价策略迅速占领了一席之地。作为一个以KVM和XEN虚拟化技术为基础的平台,HostYun不仅满足了用户对低成本服务的需求,也为学习、测试和小型项目的部署提供了理想的选择。...

      Nginx Cache Control: 如何使用 No Cache 精确管理缓存策略

      作为一名开发者,我一直非常欣赏 Nginx 作为高性能 HTTP 和反向代理服务器的能力。Nginx 不仅在稳定性和可扩展性方面表现出色,它的缓存控制功能也相当强大。通过设置响应头,Nginx 能有效地管理客户端和代理服务器的缓存行为,让我在开发和部署时能够更灵活地处理资源的缓存。 使用缓存控制的好...

      如何选择合适的IP站及其运作原理

      IP站的运作原理 在探讨IP站的运作原理之前,首先需要明确什么是IP站。简单来说,IP站是一种特殊的网络服务,它利用互联网协议(IP)提供不同的网络功能和服务。每个IP站都与一个或多个IP地址相连,能够用来访问信息、数据或应用程序。在我的网络体验中,无论是个人使用还是企业应用,IP站总是扮演着至关重...

      如何选择合适的VPS进行购买:关键因素解析

      选择合适的VPS进行购买是一项涉及多个因素的决策。VPS,即虚拟专用服务器,是一种介于共享主机和独立服务器之间的托管解决方案。特别适合需要灵活性和可扩展性的用户,无论是个人开发者、企业还是网站管理员。这种灵活性让VPS成为现代网络环境中一个非常受欢迎的选择。 VPS与传统的共享主机存在显著区别。传统...