IOC动态代理实现原理

1.静态代理

/**

* Created by on 2021/8/2.

* SayHello接口

*/

public interface SayHello {

    void sayHi();

}



/**

* Created by on 2021/8/2.

* 被代理对象 实现了SayHello接口

*/

public class Daviimplements SayHello {

@Override

    public void sayHi() {

        System.out.println("hello china");

    }

}


/**

* Created by on 2021/8/2.

* 代理对象实现了SayHello 接口并且持有被代理对象

*/

public class ProxyObjectimplements SayHello{

SayHellosayHello;

    public ProxyObject(SayHello sayHello) {

          this.sayHello = sayHello;

    }

@Override

    public void sayHi() {

        System.out.println("Do something before say Hi");

        sayHello.sayHi();

        System.out.println("Do something after say Hi");

    }

}

使用静态代理我们可以很方便的在目标方法之前或之后加入一些其他的操作。比如 打印日志、权限集中申请、增加程序灵活度、解耦调用层与实现层等等。

2.动态代理

动态代理,是我们在程序运行时候。通过反射的方式,动态生成代理class,通过类加载器加载代理class到内存中,再通过反射获取代理对象。

import sun.misc.ProxyGenerator;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class Main {

public static void main(String[] args) {

        File file =new File("Chapter_02/Proxy/dynamic_proxy01/src/DynamicProxyImpl.class");

        // 创建被代理对象

        Davi davi =new Davi();

        // 生成代理文件 ---其实就是生成代理对象的 class(二进制数组)  第一个参数是指定的class       名称 第二个参数是代理的接口

        byte [] stream =ProxyGenerator.generateProxyClass("DynamicProxyImpl",new Class[]{davi.getClass()});

        try {

            FileOutputStream fos =new FileOutputStream(file);

            fos.write(stream);

            fos.flush();

            fos.close();

        }catch (Exception e) {

            e.printStackTrace();

        }

}

}


运行完生成的class对应源码中的图2



图1
图2
图3

优缺点对比

相较于静态代理动态的灵活程度高,可以在运行时生成任意代理对象,静态代理是在编译时,生成的代理对象,在编译时期,代理对象已持有被代理者。程序灵活度不高扩展性差。因为动态代理是在运行时通过反射动态生成,动态代理的性能相较于静态代理稍逊一筹。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容