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

【设计模式】java代理之jdk动态代理jdk动态代理

10小时前CN2资讯

1.申明目标接口:

public interface Subject { void request(); void hello(); }

2.申明目标类,实现目标接口:

public class RealClass implements Subject { @Override public void request() { System.out.println("request----"); } @Override public void hello() { System.out.println("hello=======----"); } }

3.申明处理器对象:并非代理对象

package pers.lish.girl.aoplearning.dynamicproxy_jdk; import pers.lish.girl.aoplearning.staticproxy.RealClass; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 类似aspect注解---动态获取反射方法----接口实现 * create by luofeng on 2017-12-22 16:14 */ public class JdkSubject implements InvocationHandler { private RealClass realClass; /** * 引用真实实现类 * @param realClass */ public jdkSubject ( RealClass realClass){ this.realClass=realClass; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理前执行-===---------------"); Object result=null; try { //动态获取对象,动态传参 result = method.invoke(realClass, args); } catch (Exception e) { System.out.println("错误:-----"+e.getMessage()); System.out.println("代理类不能改变实际的逻辑执行,所以异常要抛出"); throw e; } finally { System.out.println("代理后执行----------------"); } return result; } }

4.测试类:

package pers.lish.girl.aoplearning.dynamicproxy_jdk; import pers.lish.girl.aoplearning.staticproxy.RealClass; import pers.lish.girl.aoplearning.staticproxy.Subject; import java.lang.reflect.Proxy; import java.util.Properties; import java.util.Set; import java.util.TreeSet; /** * create by lishengbo on 2017-12-22 16:21 * 优点: * 代码简洁易读 * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) */ public class JDKTest { public static void main(String[] args) { //设置将代理类生成出来 jdk>8使用 //jdk<=8 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true"); System.setProperty("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true"); //1.创建目标对象 RealClass realClass = new RealClass(); //2.创建调用处理器对象 JdkSubject jdkSubject = new JdkSubject(); //3.动态生成代理对象 new Class[]{Subject.class} 也可以换成 SubjectImpl.class.getInterfaces() Subject subject= (Subject) Proxy.newProxyInstance(JDKTest.class.getClassLoader(),new Class[]{Subject.class},jdkSubject); //4.查看代理对象名称:com.sun.proxy.$Proxy0 //和代理对象父类名称 System.out.println(subject.getClass().getName()); System.out.println(subject.getClass().getSuperclass().getName()); //5.客户端通过代理对象调用方法 //本次调用将自动被代理处理器的invoke方法接收 subject.request(); subject.hello(); } }

5.打开代理类,查看执行过程:






    你可能想看:

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

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

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

    分享给朋友:

    “【设计模式】java代理之jdk动态代理jdk动态代理” 的相关文章

    如何用GoDaddy优惠码续费省更多?最新折扣码全解析

    什么是GoDaddy续费优惠码 GoDaddy续费优惠码是GoDaddy为用户提供的一种折扣工具,专门用于在续费时享受价格优惠。无论是续费域名、主机还是其他服务,这些优惠码都能帮助用户节省开支。优惠码通常以字母和数字的组合形式出现,用户只需在结账时输入或通过特定链接直接应用,即可享受相应的折扣。 续...

    如何将800G硬盘进行有效分区

    在我们深入探讨硬盘分区之前,理解硬盘分区的概念非常重要。硬盘分区是将一个物理硬盘划分为多个独立部分的过程。每个分区就像独立的小仓库,可以用来存储不同类型的数据,比如系统文件、应用程序、甚至个人文件。当我第一次接触硬盘的时候,就被这个划分方法吸引住了。不仅能帮助我更好地管理和查找文件,还能提高系统的运...

    解决Linode被封的问题与账户恢复策略分享

    Linode作为一款备受欢迎的美国VPS,其灵活性和服务质量吸引了众多用户。然而,基于我的经验,国内用户在使用Linode时常常面临被封的困扰。这不仅影响了使用体验,也对业务的持续性造成了影响。我想深入分析一下Linode被封的原因。 首先,Linode的全球网络状况在近年来遭遇了严峻挑战。随着越来...

    阿里云国际站:轻松注册与支付方式全解析

    什么是阿里云国际站? 在这个科技迅速发展的时代,云计算已经成为许多企业和个人开展业务的重要基础设施。阿里云国际站便是一处全球化的云计算服务平台,旨在为世界各地的用户提供高效、灵活和安全的云计算服务。它不仅支持多种功能,还具备强大的全球基础设施,能够满足不同用户的需求。 阿里云国际站被设定为一个面向全...

    便宜的国外主机推荐:性价比高的主机选择指南

    在选择国外主机服务时,价格通常是一个重要的考量因素。面对纷繁复杂的选择,我发现一些便宜且性能不错的国外主机服务,让我大为惊喜。这里,我想和大家分享几款我认为性价比非常高的国外主机。 首先,我接触到UCloud。它的起售价为34元一个月,提供包括云服务器、GPU服务器和裸金属服务器在内的多种产品。这种...

    深入了解CN2 GIA VPS:选择更快稳定的虚拟专用服务器

    在现代互联网环境中,选择合适的虚拟专用服务器(VPS)至关重要。CN2 GIA VPS,则是个不错的选择。它基于中国电信的CN2 GIA国际精品网络,这一网络是中国电信下一代承载网络的高端产品,又被称为Chinatelecom Next Carrier Network- Global Interne...