美文网首页
Java动态代理-代理类的生成

Java动态代理-代理类的生成

作者: 沐兮_d64c | 来源:发表于2018-08-29 11:19 被阅读0次

1,生成过程。

1)全限定名:com.sun.proxy.$Proxy0~n


image.png

2)生成的类都继承了Proxy类,并且实现了interfaces接口。

2,Proxy类的具体内容

1)类加载后,并初始化时。通过反射获取equals、toString、hashCode的Method对象。以及MyInterface的doA Method对象。
2)代理类本身实现了MyInterface接口,重写了Object的几个方法。
3)Proxy类拥有InvocationHandler对象,所有对proxy 方法的调用,都会转为对InvocationHandler的invoke方法的调用。super.h.invoke(this, m3, (Object[])null);
4)InvocationHandler拥有target真实对象,会转为对target真实对象method方法的调用。

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return method.invoke(realObj, args);
            }
import com.hzq.MyInterface;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;

public final class Proxy01 extends Proxy implements MyInterface {
    private static Method m1;
    private static Method m3;
    private static Method m2;
    private static Method m0;

    public Proxy01(InvocationHandler var1) throws  {
        super(var1);
    }

    public final boolean equals(Object var1) throws  {
        try {
            return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final void doA() throws  {
        try {
            super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m3 = Class.forName("com.hzq.MyInterface").getMethod("doA");
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}

3)模拟生成代理类ProxyGenerator.generateProxyClass

public static byte [] saveGenerateProxyClass(String name, Class<?> [] interfaces) {
        byte[] classFile = ProxyGenerator.generateProxyClass(name, interfaces);
        FileOutputStream out = null;
        try {
            String filePath = "/Users/hzq/gitsrc/my-quick-start" + "/" + name + ".class";
            out = new FileOutputStream(filePath);
            out.write(classFile);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(out != null) out.close();
            } catch (IOException e) {
            }
        }
        return classFile;
    }

相关文章

  • JDK动态代理

    JDK动态代理要点: 类:java.lang.reflect.Proxy(动态生成代理类) 接口:java.lan...

  • 动态代理的实现

    一.我对动态代理的理解 1.动态生成代理类java源文件2.将代理类java源文件编译为代理类class字节码文件...

  • java 动态代理

    1、代理模式 2、java 动态代理2.1 InvocationHandler 实现类告诉程序运行动态生成的代理...

  • java 动态代理

    动态代理动态代理可以让我们在运行时动态生成代理类,解耦程度更高。Java 动态代理的实现主要借助于 java.la...

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • Java代理(jdk静态代理、动态代理和cglib动态代理)

    jdk静态代理 jdk动态代理 jdk动态代理的业务类必须实现接口 业务类的实现类 代理类的生成 cglib动态代...

  • java中动态代理代码解析

    接口类IPerson 具体实现类Man 动态代理类生成 反编译查看最终生成的代理类$Proxy0,可以理解动态代理...

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • java随笔(十一)

    java动态代理源码分析,总结。java动态代理实现步骤: 通过阅读源码发现,动态生成代理对象$Proxy0,该对...

网友评论

      本文标题:Java动态代理-代理类的生成

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