Java 将代理类序列化为文件

Java 将代理类序列化为文件,java,proxy-classes,cglib,Java,Proxy Classes,Cglib,我有一个代理(作为JDKProxy或CGLIB生成),它是在JVM运行时生成的。我想知道是否有办法将这个类的内容(看起来像com.sun.proxy$Proxy123.class)写入一个文件,这样我就可以使用类似JDEclipse的反编译器来查看生成的代码类型。由于该类存在于JVM中,我想知道是否有一种方法可以让类加载器向实际的类提供一个InputStream/URL,然后可以使用该类将内容写入磁盘,并且可以使用jd eclipse或javap读取磁盘上的该文件。我知道这不是一个生产用例,但我

我有一个代理(作为JDKProxy或CGLIB生成),它是在JVM运行时生成的。我想知道是否有办法将这个类的内容(看起来像com.sun.proxy$Proxy123.class)写入一个文件,这样我就可以使用类似JDEclipse的反编译器来查看生成的代码类型。由于该类存在于JVM中,我想知道是否有一种方法可以让类加载器向实际的类提供一个InputStream/URL,然后可以使用该类将内容写入磁盘,并且可以使用jd eclipse或javap读取磁盘上的该文件。我知道这不是一个生产用例,但我很想看看这个动态生成的类的内容

谢谢

您可以使用重新传输功能,并请求代理类的重新传输。然后,在transformer中,您可以使用组成类的字节数组。将数组保存到类文件后,只需返回未经修改的数组,即可让JVM不受影响地继续运行

但我不确定你对这些课程的期望是什么。它们是直接实现的,不会带来任何意外。下面是在使用Oracle的jdk1.7.0\U 40生成的
java.lang.Runnable
代理
上执行上述步骤后的
javap
输出示例:

public final class com.sun.proxy.$Proxy0 extends java.lang.reflect.Proxy implements java.lang.Runnable {
  private static java.lang.reflect.Method m1;

  private static java.lang.reflect.Method m3;

  private static java.lang.reflect.Method m0;

  private static java.lang.reflect.Method m2;

  public com.sun.proxy.$Proxy0(java.lang.reflect.InvocationHandler);
    Code:
       0: aload_0       
       1: aload_1       
       2: invokespecial #8                  // Method java/lang/reflect/Proxy."<init>":(Ljava/lang/reflect/InvocationHandler;)V
       5: return        

  public final int hashCode();
    Code:
       0: aload_0       
       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
       4: aload_0       
       5: getstatic     #55                 // Field m0:Ljava/lang/reflect/Method;
       8: aconst_null   
       9: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
      14: checkcast     #57                 // class java/lang/Integer
      17: invokevirtual #60                 // Method java/lang/Integer.intValue:()I
      20: ireturn       
      21: athrow        
      22: astore_1      
      23: new           #42                 // class java/lang/reflect/UndeclaredThrowableException
      26: dup           
      27: aload_1       
      28: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V
      31: athrow        
    Exception table:
       from    to  target type
           0    21    21   Class java/lang/Error
           0    21    21   Class java/lang/RuntimeException
           0    21    22   Class java/lang/Throwable

  public final boolean equals(java.lang.Object);
    Code:
       0: aload_0       
       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
       4: aload_0       
       5: getstatic     #20                 // Field m1:Ljava/lang/reflect/Method;
       8: iconst_1      
       9: anewarray     #22                 // class java/lang/Object
      12: dup           
      13: iconst_0      
      14: aload_1       
      15: aastore       
      16: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
      21: checkcast     #30                 // class java/lang/Boolean
      24: invokevirtual #34                 // Method java/lang/Boolean.booleanValue:()Z
      27: ireturn       
      28: athrow        
      29: astore_2      
      30: new           #42                 // class java/lang/reflect/UndeclaredThrowableException
      33: dup           
      34: aload_2       
      35: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V
      38: athrow        
    Exception table:
       from    to  target type
           0    28    28   Class java/lang/Error
           0    28    28   Class java/lang/RuntimeException
           0    28    29   Class java/lang/Throwable

  public final java.lang.String toString();
    Code:
       0: aload_0       
       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
       4: aload_0       
       5: getstatic     #65                 // Field m2:Ljava/lang/reflect/Method;
       8: aconst_null   
       9: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
      14: checkcast     #67                 // class java/lang/String
      17: areturn       
      18: athrow        
      19: astore_1      
      20: new           #42                 // class java/lang/reflect/UndeclaredThrowableException
      23: dup           
      24: aload_1       
      25: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V
      28: athrow        
    Exception table:
       from    to  target type
           0    18    18   Class java/lang/Error
           0    18    18   Class java/lang/RuntimeException
           0    18    19   Class java/lang/Throwable

  static {};
    Code:
       0: ldc           #70                 // String java.lang.Object
       2: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
       5: ldc           #77                 // String equals
       7: iconst_1      
       8: anewarray     #72                 // class java/lang/Class
      11: dup           
      12: iconst_0      
      13: ldc           #70                 // String java.lang.Object
      15: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
      18: aastore       
      19: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
      22: putstatic     #20                 // Field m1:Ljava/lang/reflect/Method;
      25: ldc           #83                 // String java.lang.Runnable
      27: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
      30: ldc           #84                 // String run
      32: iconst_0      
      33: anewarray     #72                 // class java/lang/Class
      36: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
      39: putstatic     #50                 // Field m3:Ljava/lang/reflect/Method;
      42: ldc           #70                 // String java.lang.Object
      44: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
      47: ldc           #85                 // String hashCode
      49: iconst_0      
      50: anewarray     #72                 // class java/lang/Class
      53: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
      56: putstatic     #55                 // Field m0:Ljava/lang/reflect/Method;
      59: ldc           #70                 // String java.lang.Object
      61: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
      64: ldc           #86                 // String toString
      66: iconst_0      
      67: anewarray     #72                 // class java/lang/Class
      70: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
      73: putstatic     #65                 // Field m2:Ljava/lang/reflect/Method;
      76: return        
      77: astore_1      
      78: new           #90                 // class java/lang/NoSuchMethodError
      81: dup           
      82: aload_1       
      83: invokevirtual #93                 // Method java/lang/Throwable.getMessage:()Ljava/lang/String;
      86: invokespecial #96                 // Method java/lang/NoSuchMethodError."<init>":(Ljava/lang/String;)V
      89: athrow        
      90: astore_1      
      91: new           #100                // class java/lang/NoClassDefFoundError
      94: dup           
      95: aload_1       
      96: invokevirtual #93                 // Method java/lang/Throwable.getMessage:()Ljava/lang/String;
      99: invokespecial #101                // Method java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V
     102: athrow        
    Exception table:
       from    to  target type
           0    77    77   Class java/lang/NoSuchMethodException
           0    77    90   Class java/lang/ClassNotFoundException

  public final void run();
    Code:
       0: aload_0       
       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
       4: aload_0       
       5: getstatic     #50                 // Field m3:Ljava/lang/reflect/Method;
       8: aconst_null   
       9: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
      14: pop           
      15: return        
      16: athrow        
      17: astore_1      
      18: new           #42                 // class java/lang/reflect/UndeclaredThrowableException
      21: dup           
      22: aload_1       
      23: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V
      26: athrow        
    Exception table:
       from    to  target type
           0    16    16   Class java/lang/Error
           0    16    16   Class java/lang/RuntimeException
           0    16    17   Class java/lang/Throwable
}
public final class com.sun.proxy.$Proxy0扩展java.lang.reflect.proxy实现java.lang.Runnable{
私有静态java.lang.reflect.Method m1;
私有静态java.lang.reflect.Method m3;
私有静态java.lang.reflect.Method m0;
私有静态java.lang.reflect.Method m2;
public com.sun.proxy.$Proxy0(java.lang.reflect.InvocationHandler);
代码:
0:aload_0
1:aload_1
2:invokespecial#8//方法java/lang/reflect/Proxy.“:(Ljava/lang/reflect/InvocationHandler;)V
5:返回
公共final int hashCode();
代码:
0:aload_0
1:getfield#16//Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
4:aload_0
5:getstatic#55//字段m0:Ljava/lang/reflect/Method;
8:aconst_null
9:invokeinterface#28,4//InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
14:checkcast#57//class java/lang/Integer
17:invokevirtual#60//方法java/lang/Integer.intValue:()I
20:我轮到你了
21:athrow
22:astore_1
23:new#42//class java/lang/reflect/UndeclaredThrowableException
26:dup
27:aload_1
28:invokespecial#45//方法java/lang/reflect/UndeclaredThrowableException。”:(Ljava/lang/Throwable;)V
31:athrow
例外情况表:
从到目标类型
0 21类java/lang/Error
0 21类java/lang/RuntimeException
0 21 22类java/lang/Throwable
公共最终布尔值等于(java.lang.Object);
代码:
0:aload_0
1:getfield#16//Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
4:aload_0
5:getstatic#20//字段m1:Ljava/lang/reflect/Method;
8:iconst_1
9:anewarray#22//类java/lang/Object
12:dup
13:iconst_0
14:aload_1
15:aastore
16:invokeinterface#28,4//InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
21:checkcast#30//class java/lang/Boolean
24:invokevirtual#34//方法java/lang/Boolean.booleanValue:()Z
27:我轮到你了
28:athrow
29:astore_2
30:new#42//class java/lang/reflect/UndeclaredThrowableException
33:dup
34:aload_2
35:invokespecial#45//方法java/lang/reflect/UndeclaredThrowableException。”:(Ljava/lang/Throwable;)V
38:athrow
例外情况表:
从到目标类型
0 28类java/lang/Error
0 28类java/lang/RuntimeException
0 28 29类java/lang/Throwable
public final java.lang.String toString();
代码:
0:aload_0
1:getfield#16//Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;
4:aload_0
5:getstatic#65//字段m2:Ljava/lang/reflect/Method;
8:aconst_null
9:invokeinterface#28,4//InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;
14:checkcast#67//class java/lang/String
17:轮到你了
18:athrow
19:astore_1
20:new#42//类java/lang/reflect/UndeclaredThrowableException
23:dup
24:aload_1
25:invokespecial#45//方法java/lang/reflect/UndeclaredThrowableException。”:(Ljava/lang/Throwable;)V
28:athrow
例外情况表:
从到目标类型
0 18类java/lang/Error
0 18类java/lang/RuntimeException
0 18 19类java/lang/Throwable
静态{};
代码:
0:ldc#70//String java.lang.Object
2:invokestatic#76//方法
Foo f = (Foo) proxyClass.
    getConstructor(new Class[] { InvocationHandler.class }).
    newInstance(new Object[] { handler });