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

Java代理(静态、动态)java动态代理

3天前CN2资讯

一、静态代理 代理类和被代理类继承同一个接口,在代理类事例时需要被代理类作为参数,这样就调用到被代理类了; 缺点:每个被代理类都需要写一个对应的代理类;

public class Target{ void run(){ System.out.println("run Target!"); } } public class Proxy extends Target{ private Target target; Proxy(Target target){ this.target = target; } @Override void run(){ System.out.println("proxy do something else!"); this.target.run(); } } //使用 void test(){ Target target = new Target(); Proxy proxy = new Proxy(target); //调用代理的方法来替代直接调用原方法 proxy.run(); }

二、动态代理 1、jdk动态代理 代理类需要继承invocationhandler借口,原理也是基与接口,类似静态代理; 缺点:没有写接口的被代理类不能被代理,通过反射实现调用,比直接调用慢;

public interface TargetInter{ void run(); } public class Target implements TargetInter{ public void run(){ System.out.println("run Target!"); }//欢迎加入Java开发交流君样:909038429 } public class Myproxy implements InvocationHandler{ private Object obj; public Object bind(Object obj){ this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("jdk dynamic proxy"); method.invoke(obj, args); return null; } } void test(){ Target target = new Target(); TargetInter myproxy = (TargetInter) new Myproxy().bind(target); myproxy.run(); } ---------------------------------------------------- test()结果: jdk dynamic proxy run Target!

2、动态代理CGLIB 原理:运行时动态的生成一个被代理类的子类(通过ASM字节码处理框架实现),子类重写了被代理类中所有非final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,然后植入AOP逻辑。 缺点:带final修饰的被代理类不能被代理

public class Target { public void run(){//欢迎加入Java开发交流君样:909038429 System.out.println("run Target!"); } } public class Myproxy { Object obj; public Object bind(final Object target){ this.obj = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(obj.getClass()); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable{ System.out.println("CGLIB dynamic proxcy"); Object res = method.invoke(target, args); return res; } } ); return enhancer.create(); } } void test(){ Target target = new Target(); Target proxy = (Target) new Myproxy().bind(target); }

注意: 代理目标对象不能是内部类(因为内部类的创建依赖外部类),如果是内部类,cglib代理内部会获取到一个有参构造函数(参数是外部类对象,如果实在需要代理一个内部类,可以通过传递构造参数实现) Cglib代理默认创建一个缺省构造函数的目标对象,如果目标对象存在有参构造函数,Cglib进行代理时需要指定构造函数的参数,或者在目标对象上必须存在缺省构造函数,否则抛出异常Superclass has no null constructors but no arguments were given(可以通过传递构造参数创建代理类)

3、spring代理机制 优先使用jdk动态代理,如果对象没接口则使用CGLIB代理

其他: 开闭原则:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。 一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的。 最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429 /./*欢迎加入java交流Q君样:909038429一起吹水聊天

    你可能想看:

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

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

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

    分享给朋友:

    “Java代理(静态、动态)java动态代理” 的相关文章

    中国电信CN2线路连接图:连接未来,助力企业腾飞

    在信息技术飞速发展的今天,企业对于网络的需求已经从“可用”提升到了“高效、稳定、安全”的更高层次。而在这个数字化转型的关键时期,中国电信推出的CN2线路连接图正成为众多企业的首选解决方案。本文将带您深入了解中国电信CN2线路连接图的核心优势及其在企业中的广泛应用。一、中国电信CN2线路连接图的定义与...

    如何在VPS上轻松部署和管理Telegram机器人 | 详细指南

    1.1 创建Telegram机器人 在Telegram上创建一个机器人非常简单。我们只需要与@BotFather进行对话。@BotFather是Telegram官方提供的机器人管理工具,专门用于创建和管理机器人。通过发送/newbot命令,我们可以开始创建自己的机器人。@BotFather会引导我们...

    探索香港节点的地理与经济优势及其全球数据传输作用

    香港节点的地理与经济优势 谈到香港的地理和经济优势,我总是想起它的独特地理位置。香港位于亚洲的心脏地带,紧密相连着中国大陆、东南亚、日本和韩国等区域。这些距离使得这里成为了数据流量的重要连接点。无论是企业还是个人,想要快速和高效地进行国际沟通时,香港总是首选的地方之一。作为一个全球重要的金融中心,香...

    选择最佳VPS主机服务:Digital-VM全面解析与性能优化策略

    谈到 Digital-VM,我总会被它的成长故事所吸引。这家主机商成立于2018年,致力于为用户提供高效、灵活的VPS主机解决方案。作为一家美国公司,它在短时间内就扩大了服务范围,减少了用户在选择主机服务时的焦虑。Digital-VM 看似是一颗新星,却在竞争激烈的市场中脱颖而出,令人刮目相看。 在...

    台湾原生IP的优势与选择指南,助你畅享极速网络体验

    在信息化时代,网络的使用变得愈发普遍,原生IP的概念逐渐进入大众视野。简单来说,台湾原生IP指的是源自台湾本地的互联网协议地址。与其他地区的IP不同,台湾原生IP能够有效实现更快速、更稳定的网络连接,给用户带来良好的上网体验。我们生活在一个无时无刻不在与网络打交道的时代,理解这项技术的内涵至关重要。...

    腾讯云国际版:全球云服务的强者之选,满足您的业务需求

    腾讯云国际版概述 腾讯云国际版的定义与背景 腾讯云国际版是腾讯公司专为全球客户推出的一款云服务产品,旨在满足不同国家和地区用户的需求。它在功能上与国内版本相似,但根据国际市场的需求进行了优化,以确保服务的稳定性和流畅性。作为一名用户,我发现腾讯云国际版特别注重数据隐私和合规性,这对于希望拓展海外市场...