zoukankan      html  css  js  c++  java
  • 动态代理的实现(Proxy类的实现)

    1. Proxy类的

    newProxyInstance 的实现:

    1. 获得代理类,这个代理类有点类似与Proxy类的子类。这个代理类有一个接受

    Proxy(InvocationHandler h) 的构造函数。

    public static Object newProxyInstance(ClassLoader loader,

    Class<?>[] interfaces,

    InvocationHandler h){

    Class<?> cl = getProxyClass(loader, interfaces);

    Constructor cons = cl.getConstructor(constructorParams);

    return cons.newInstance(new Object[] { h });

    }

    2. 获得代理类的 Proxy(InvocationHandler h) 构造方法。

    3. 通过Constructor cons构造方法,获得代理类的实例。

    2. 下面的重点就是getProxyClass是如何构造代理类的?

    public static Class<?> getProxyClass(ClassLoader loader,

    Class<?>... interfaces)

    byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

    proxyName, interfaces);

    proxyClass = defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length);

    return proxyClass;

    }

    上面的实现是简化后的核心代码。可以第一步:使用代理类生成器(ProxyGenerator)生成代理类文件(class文件)。第二步:用 classloader来加载该类。

    三:ProxyGenerator类的 generateProxyClass 方法

    ProxyGenerator gen = new ProxyGenerator(name, interfaces);

    final byte[] classFile = gen.generateClassFile();

    generateClassFile这个方法的实现大致是:生成一个继承自

    /** name of the superclass of proxy classes */

    private final static String superclassName = "java/lang/reflect/Proxy";

    类的子类。实现每一个interfaces,实现的机制是:直接调用

    /** name of field for storing a proxy instance's invocation handler */

    private final static String handlerFieldName = "h";

    的invoke方法。

    注意,这里的实现策略,是直接生成二进制文件,而不是生成java文件,然后在编译生成class文件,而是直接生成class文件。

  • 相关阅读:
    ::在c++中的应用
    VS2008工程一些操作
    vs2008添加链接库
    从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) [转]
    Android PowerImageView实现,可以播放动画的强大ImageView[转]
    INI文件读写
    关于超链接伪类的使用,:link,:visited,:hover
    关于div的居中显示
    常见公告栏信息效果的实现
    利用ul,li,span,position:relative实现文本的居中显示
  • 原文地址:https://www.cnblogs.com/a-ray-of-sunshine/p/4658720.html
Copyright © 2011-2022 走看看