美文网首页
反射与动态代理

反射与动态代理

作者: 原创迷恋者 | 来源:发表于2019-08-18 09:53 被阅读0次

    反射
    Java 反射机制在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种 动态的获取信息 以及 动态调用对象的方法 的功能称为 java 的反射机制。

    反射机制很重要的一点就是“运行时”,其使得我们可以在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。换句话说,Java 程序可以加载一个运行时才得知名称的 .class 文件,然后获悉其完整构造,并生成其对象实体、或对其 fields(变量)设值、或调用其 methods(方法)。

    反射让静态语言具有了动态语言的部分能力。静态语言与动态语言的简单区分方法是:语言的类型信息,在运行时检查、还是在编译期检查。

    反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(Introspect)的能力。通过运行时操作元数据或对象,Java可以灵活地操作运行时才能确定的信息。

    动态代理
    动态代理是一种在运行时能构建动态代理、动态处理的机制,保留包装RPC调用、面向切面的编程(AOP)。很多繁琐的重复编程,都可以被动态代理机制优雅解决。

    动态代理首先是一个代理机制,像是设计模式中的代理模式,代理可以看作是对调用目标的一个包装。我们对目标代码的调用不是直接发生的,而是通过代理完成。

    通过代理可以让调用者和实现者之间解耦,比如RPC调用、框架内部寻址、序列化、反序列化等。对调用者往往没有太大意义的操作,可以通过代理,提供更友善的界面。

    实现动态代理的方式很多,比如JDK自身提供的动态代理,利用了反射的机制;保留利用字节码操作机制,比如ASM、cglib、Javassist等。

    动态代理完美符合切面编程。

    AOP
    AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

    AOP可以被看作是OOP的一个补充。因为OOP对于跨越不同对象或类的分散、纠缠逻辑表现能力不够。

    AOP可以通过动态代理的机制,让开发者从这些繁琐事项中抽身出来,大幅度提高了代码的抽象程度和复用度。

    Spring AOP支持两种模式的动态代理,JDK Proxy或cglib。cglib动态代理采用的是创建目标类子类的方式,而不是使用接口。

    相关文章

      网友评论

          本文标题:反射与动态代理

          本文链接:https://www.haomeiwen.com/subject/xptrsctx.html