美文网首页
Java Proxy 代理

Java Proxy 代理

作者: hi一一 | 来源:发表于2019-08-23 00:15 被阅读0次

原理

运行时生成 一个类的示例。名字为:$Proxy0.(不同接口,数字递增);

继承Proxy类。实现给定的接口;

下面是反编译的class:

-
public final class $Proxy0 extends Proxy implements TestInterface 

完整反编译class 见下方附录;

①:生成的类和实例。只是运行时的,并不是持久化的。

可以通过下面的代理,打印:

Class $Proxy0 = Class.forName("com.sun.proxy.$Proxy0");

System.out.println("$Proxy0:" + $Proxy0);

②:可以通过ProxyGenerator类,把class写到文件

byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy0", TestImpl.class.getInterfaces());


附录

代理类反编译

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//

import bean.TestInterface;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.lang.reflect.UndeclaredThrowableException;

public final class $Proxy0 extends Proxy implements TestInterface {

private static Method m1;

private static Method m2;

private static Method m3;

private static Method m4;

private static Method m0;

public $Proxy0(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 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 void hey(String var1) throws  {

try {

super.h.invoke(this, m3, new Object[]{var1});

} catch (RuntimeException | Error var3) {

throw var3;

} catch (Throwable var4) {

throw new UndeclaredThrowableException(var4);

}

}

public final void say() throws  {

try {

super.h.invoke(this, m4, (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"));

m2 = Class.forName("java.lang.Object").getMethod("toString");

m3 = Class.forName("bean.TestInterface").getMethod("hey", Class.forName("java.lang.String"));

m4 = Class.forName("bean.TestInterface").getMethod("say");

m0 = Class.forName("java.lang.Object").getMethod("hashCode");

} catch (NoSuchMethodException var2) {

throw new NoSuchMethodError(var2.getMessage());

} catch (ClassNotFoundException var3) {

throw new NoClassDefFoundError(var3.getMessage());

}

}

}


总结

局限性很大:

1.代理类必须有一个接口。 cglib 更为强大


参考文章

java动态代理实现与原理详细分析

相关文章

  • Java代理

    前言 Java代理大致可以分为静态代理(static proxy),动态代理(dynamic proxy)。所谓代...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • Dubbo Proxy 原理与实例

    Java代理 Java代理:通过反射和InvocationHandler回调接口实现 Proxy.newProxy...

  • Java 静态、动态代理

    一 代理(Proxy)概述 代理(Proxy)是 23种Java常用设计模式之一,提供了对目标对象(被代理对象)的...

  • JDK动态代理

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

  • 测试Proxy和Enhancer两种代理方式(转)

    区别 Proxy是基于接口的方式进行代理,Enhancer是基于继承的方式代理。proxy是java.lang.r...

  • java随笔(十一)

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

  • Java动态代理简析原理

    说下Java动态代理,Spring的AOP就是基于Java的动态代理实现的。动态代理用到的几个类和接口,Proxy...

  • 代理之JDK动态代理(2018-07-26)

    jdk动态代理使用: 核心方法: 使用java.lang.reflect.Proxy中的方法Proxy.newPr...

  • 4

    6、java动态代理:两个重要类: 1、Proxy:jdk提供的帮助类(类似于工厂)用于生成代理实例,Proxy....

网友评论

      本文标题:Java Proxy 代理

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