资讯专栏INFORMATION COLUMN

java动态代理的理解

IamDLY / 3048人阅读

摘要:动态代理能干嘛提供了另外一种实现接口的方式,不用也能实现接口。有了动态代理,中的网络交互部分可以完全写在框架中,对用户来说编程更加方便。

静态代理
public class TargetClass{
    void method1()
}

public class ProxyClass{
    private TargetClass target;
    
    public void method1(){
        target.method1()
    }
}

代理类持有目标类的引用

动态代理
public interface TargetIntf{
    void method1();
}

public DynamicProxy implements InvocationHandler{
    @Override
    public Object invoke(Object o, Method method, Object[] args){
        //do proxy
    }
}

InvocationHandler handler = new DynamicProxy();
Proxy theProxy = (TargetIntf)Proxy.newInstance(hander.getClass().getClassLoader(), new Class[]{TargetIntf.class}, handler);
theProxy.method1()

要有接口

要实现InocationHandler

通过Proxy.newInstance来生成代理类

通过强转取得目标类的实例

如何理解动态代理

当调用theProxy的method1时,会触发handler.invoke方法的调用,方法(Method)和参数都会传递给invoke方法,invoke方法里面想做什么都行。

为什么Proxy.newInstance可以强转成TargetIntf呢?

Proxy.newInstance返回的对象实现了TargetIntf接口的方法,所以可以强转。

为什么调用proxy的method1方法会调用到handler的invoke方法?

Proxy.newInstance返回的对象组合了handler,并在method1方法的实现逻辑中添加了handler.invoke的调用。

Proxy.newInstance如何动态的实现TargetIntf的方法并返回对象实例呢?

动态的生成class文件,java类的信息都是从class文件加载进来的,Proxy.newInstance方法中动态的生成了class文件并加载。

动态代理能干嘛?

提供了另外一种实现接口的方式,不用implements也能实现接口。

可以用来写框架

试想一下,如果没有动态代理,dubbo框架如何实现?

动态代理的dubbo实现:

client和server端都依赖api的接口

client端不实现api接口,通过动态代理,把api接口调用连接到Invocation.invoke方法上,在此方法中将对象、方法名、参数等通过网络发送给server端

server端实现api的接口,把client端发送过来的rpc调用连接到api接口的具体实现上。

没有动态代理的实现:

client和server端都依赖api接口

client端实现api接口,接口的实现逻辑为把对象、方法名、参数等通过网络发送给server端

server端实现api的接口,把client端发送过来的rpc调用连接到api接口的具体实现上。

有了动态代理,dubbo rpc中的网络交互部分可以完全写在dubbo框架中,对用户来说编程更加方便。
没有动态代理,client端的api实现代码也可以通过工具自动生成,不过这样让框架使用起来更加的复杂。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74958.html

相关文章

  • java动态代理及RPC框架介绍

    摘要:这种语法,在中被称为动态代理。在动态代理机制中,这个角色只能是接口。动态代理就是实现的技术之一。 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的__call。这种语法除了能更好的实现动态代理外,还是RPC框架实现原理的一部分。 动态代理...

    2shou 评论0 收藏0
  • 你真完全了解Java动态代理吗?看这篇就够了

    摘要:动态地代理,可以猜测一下它的含义,在运行时动态地对某些东西代理,代理它做了其他事情。所以动态代理的内容重点就是这个。所以下一篇我们来细致了解下的到底是怎么使用动态代理的。 之前讲了《零基础带你看Spring源码——IOC控制反转》,本来打算下一篇讲讲Srping的AOP的,但是其中会涉及到Java的动态代理,所以先单独一篇来了解下Java的动态代理到底是什么,Java是怎么实现它的。 ...

    haitiancoder 评论0 收藏0
  • Java 动态代理 理解

    摘要:之后通过类的静态方法取得一个代理类实例再次鄙视自己。值得一提,动态代理把也代理了。总结动态代理优点相比静态代理,不用每代理一个类就得写一个新的代理类。缺点只能代理实现了接口的类,因为是单继承,代理类已经是类的子类了。 动态代理 这里暂时只做JDK动态代理分析。动态代理应用广泛,例如AOP。 showImg(https://segmentfault.com/img/bVUmAr?w=21...

    3fuyu 评论0 收藏0
  • JAVA代理模式理解和应用

    摘要:代理模式代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。 代理模式: 代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。应用场景一般是需要在执行某个已经写好的方法前后再添加一段逻辑,比如执行方法前打印日志,或者在执行方法之前和之后打时...

    CatalpaFlat 评论0 收藏0
  • 10分钟看懂动态代理设计模式

    摘要:动态代理是语言中非常经典的一种设计模式,也是所有设计模式中最难理解的一种。本文将通过一个简单的例子模拟动态代理实现,让你彻底明白动态代理设计模式的本质,文章中可能会涉及到一些你没有学习过的知识点或概念。 动态代理是Java语言中非常经典的一种设计模式,也是所有设计模式中最难理解的一种。本文将通过一个简单的例子模拟JDK动态代理实现,让你彻底明白动态代理设计模式的本质,文章中可能会涉及到...

    atinosun 评论0 收藏0

发表评论

0条评论

IamDLY

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<