美文网首页Android
android 动态代理的原理 (AOP)

android 动态代理的原理 (AOP)

作者: android源码探索 | 来源:发表于2019-10-27 22:18 被阅读0次

欢迎大家下载我个人开发的app安琪花园

定义


通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术

  1. 通过预编译的方式(比如: AspectJ)
  2. 通过运行时动态代理 ( Proxy.newInstance() )

AOP的 好处


降低耦合度, 通用代码的复用

动态代码的关键类

  1. Proxy
  2. InvocationHandler
public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

proxy: 指代生成的代理的对象
method:指我们调用真实对象的某个方法
args: 指调用某个真实对象方法的参数

动态代理的条件


  1. 被代理的对象必须要实现某一个或者多个接口

具体的使用


  1. 首先定义一个接口
public interface Subject {
    public void sayGoodBye();
    public void sayHello(String str);
}
  1. 写一个实体类继承自上面的这个接口
public class RealSubject implements Subject {
    @Override
    public void sayGoodBye() {
        System.out.println("RealSubject sayGoodBye");
    }

    @Override
    public void sayHello(String str) {
        System.out.println("RealSubject sayHello  " + str);
    }
}
  1. 自定义Invocationhandler
public class SubjectInvocationHandler implements InvocationHandler {
    //这个就是我们要代理的真实对象
    private Object subject;

    //构造方法,给我们要代理的真实对象赋初值
    public SubjectInvocationHandler(Object subject) {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable {
        //在代理真实对象前我们可以添加一些自己的操作
        System.out.println("before Method invoke");
        System.out.println("Method:" + method);
        //当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        method.invoke(subject, args);
        //在代理真实对象后我们也可以添加一些自己的操作
        System.out.println("after Method invoke");
        return null;
    }
}
  1. 具体的使用
 //被代理类
       Subject realSubject = new RealSubject();
       //我们要代理哪个类,就将该对象传进去,最后是通过该被代理对象来调用其方法的
       SubjectInvocationHandler handler = new SubjectInvocationHandler(realSubject);
       //生成代理类
       Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), 
                                                          realSubject.getClass().getInterfaces(), handler);
  1. 当调用第四步里面rrealSubject里面的方法的时候 就会转到Invocationhander里面的invoke方法

以上就是动态代理的简单实现步骤

原理


最近对动态代理的原理进行了了解。

  1. 当调用Proxy.newProxyInstance方法的时候,就会生成代理类对象,
    其名字的格式为 $Proxy + 数字的形式, 继承自Proxy, 并且实现了代理的接口。

  2. 当调用方法的时候,则调用代理对象的方法,通过对生成的代理对象的代码阅读。
    代理对象实现 了接口,重写了接口的方法,方法体为 InvocationHandler调用这个方法

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

公众号:

qrcode_for_gh_c78cd816dc53_344.jpg

相关文章

  • Spring学习系列--3.AOP

    Spring Aop Aop面向切面编程 Aop入门动态代理 动态代理,其实与Aop的原理有些相似,可以用动态代理...

  • Spring AOP 实现原理

    Spring AOP 实现原理 静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就...

  • 2018-09-16

    AOP的XML配置: AOP的先关术语: Spring底层的AOP实现原理 动态代理: JDK动态代理:只能对实现...

  • Spring AOP内部调用失效问题

    Spring AOP基本原理 Spring AOP是基于动态代理机制实现的,通过动态代理机制生成目标对象的代理对象...

  • 2018-01-31

    spring aop @(iJava)[spring framework] [toc] aop底层原理采用动态代理...

  • Spring之使用XML配置Spring AOP

    1.aop的原理 Spring AOP底层主要使用了JDK动态代理和cglib动态代理。具体可看文章设计模式之代理...

  • spring AOP

    1,原理:Spring AOP底层原理采用运行时生成动态代理的方式来增强目标对象。AOP 代理其实是由 AOP 框...

  • Spring中AOP的特性解析

    要了解Spring的AOP就必须要了解动态代理的原理,因为AOP就是基于动态代理实现的。 java.lang....

  • SSH框架之Spring进阶AOP面向切面编程(三)

    第一节:AOP简介 第二节:AOP的作用 第三节:Spring底层的AOP实现原理 动态代理: JDK动态代理:只...

  • android 动态代理的原理 (AOP)

    欢迎大家下载我个人开发的app安琪花园 定义 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 通过...

网友评论

    本文标题:android 动态代理的原理 (AOP)

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