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

JDK动态代理详解jdk动态代理

3天前CN2资讯

首先说一下动态代理和静态代理的区别
静态代理:是预先写好或由特定工具自动生成的代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 
动态代理:代理是在程序运行时,运用反射机制动态创建而成的,程序运行之前,代理是不存在的。
Java的静态代理最简单的场景,一个接口,一个实现类,一个代理类就可以搞定,这个代理类持有接口实现类的引用,这样便可以实现委托对象的增强了。
Java的动态代理主要有两种,JDK动态代理和cglib动态代理
其中JDK动态代理,主要利用了接口InvocationHandler,还有Proxy类。

InvocationHandler接口: 
public interface InvocationHandler { 
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

 参数说明: 
 Object proxy:指代理对象。 
 Method method:要调用的方法 
 Object[] args:方法调用时所需要的参数 
Proxy类: 
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口的实现类动态地生成代理类,此类提供了如下的操作方法: 
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException 

 参数说明: 
 ClassLoader loader:类加载器 
 Class<?>[] interfaces:得到全部的接口 
 InvocationHandler h:得到InvocationHandler接口的子类实例 

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 下面看一下我写的一个小例子~

package go.derek; interface Istudy { public void study(String words); }
上面的接口定义了一个方法。下面是这个接口的实现类 package go.derek; class StudyImpl implements Istudy { public void study(String words){ System.out.println(words); } }
下面看一下代理类的代码 package go.derek; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; class StudyProxy implements InvocationHandler { private Object target; public Object bind(Object target){ this.target=target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("start"); Object obj=method.invoke(target,args); System.out.println("rest"); return obj; } } 下面是测试类的代码 package go.derek; class ProxyTest { public static void main(String[] args) { StudyProxy sp=new StudyProxy(); Istudy derek=(Istudy)sp.bind(new StudyImpl()); derek.study("I'm derek"); } }
下面是输出结果:

start
I'm derek
rest
我们可以看出,代理类确实给委托类实现了增强,不能忽视的是代理类要持有委托类对象的引用。

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 

    你可能想看:

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

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

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

    分享给朋友:

    “JDK动态代理详解jdk动态代理” 的相关文章

    如何开通电信CN2网络权限?一文搞定!

    开通电信CN2网络权限,享受更快的网络连接在互联网时代,网络质量的好坏直接影响到工作和生活的方方面面。无论是企业还是个人,都希望拥有一个稳定、高速的网络连接。而电信CN2网络作为中国电信推出的一项高端网络服务,以其低延迟、高带宽和高稳定性,成为众多用户争相选择的网络解决方案。如何开通电信CN2网络权...

    六六云使用教程及价格比较,让你轻松选择合适的云服务

    六六云使用教程 六六云,作为一个备受欢迎的云服务平台,提供原生IP和住宅IP VPS服务器,适合多种需求,比如电商、游戏和流媒体等。选择合适的VPS套餐,是使用六六云的第一步。我们可以从多个方面进行比较,了解各个地区的服务器优缺点。比如,美国的服务器在速度上表现出色,但价格可能较高,而香港服务器则在...

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

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

    阿里云香港轻量服务器:高性价比云计算解决方案

    阿里云香港轻量服务器是我在寻找云计算解决方案时发现的一个非常实用的选择。它不仅具备高性价比,还有灵活的配置和便捷的管理体验,适合各种用户需求。让我带你深入了解一下这个产品的特点和优势。 首先,香港轻量服务器的价格设置比较合理。我看到它提供多个配置供用户选择,无论是新手还是有经验的开发者都能在这里找到...

    甲骨文云的永久免费服务:开发者的理想选择

    在现代云计算的环境中,甲骨文云(Oracle Cloud)作为一种强有力的云计算服务,凭借其永久免费服务吸引了许多用户。回想我初次接触甲骨文云时,正是被它提供的多种Always Free服务所吸引,比如我可以免费使用2个实例和20GB的存储空间。这让我在学习和开发上有了更加广阔的可能性,不用担心一开...

    提升国际数据传输质量的9929线路分析与应用

    谈到9929线路,首先让我给大家介绍一下AS9929线路的基本情况。这条线路是中国联通为了满足国际市场的需求而推出的一种IP传输服务专线。它的起点在香港,通过海底光缆将中国与亚太及北美地区紧密连接。同时,这条线路还在欧洲和非洲设立了多个重要的网络节点(POP点),这就为跨国数据传输提供了坚实的基础。...