将代理类序列化为文件

Kil*_*ahn 6 java proxy-classes cglib

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

谢谢!

Hol*_*ger 3

您可以使用Instrumentation注册具有重新转换功能的类ClassFileTransformer并请求重新转换该类Proxy。然后,在 Transformer\xe2\x80\x99stransform方法中,您可以使用构成该类的字节数组。将数组保存到类文件后,您只需返回未修改的数组即可让 JVM 继续运行而不受影响。

\n\n

但我\xe2\x80\x99m 不确定你对这些类的期望是什么。它们的实施是直接的,不会带来任何意外。以下是在使用 Oracle javap\xe2\x80\x99s jdk1.7.0_40 生成的文件上执行上述步骤后的 \ xe2\x80\x99s输出示例:java.lang.Runnable Proxy

\n\n
public final class com.sun.proxy.$Proxy0 extends java.lang.reflect.Proxy implements java.lang.Runnable {\n  private static java.lang.reflect.Method m1;\n\n  private static java.lang.reflect.Method m3;\n\n  private static java.lang.reflect.Method m0;\n\n  private static java.lang.reflect.Method m2;\n\n  public com.sun.proxy.$Proxy0(java.lang.reflect.InvocationHandler);\n    Code:\n       0: aload_0       \n       1: aload_1       \n       2: invokespecial #8                  // Method java/lang/reflect/Proxy."<init>":(Ljava/lang/reflect/InvocationHandler;)V\n       5: return        \n\n  public final int hashCode();\n    Code:\n       0: aload_0       \n       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;\n       4: aload_0       \n       5: getstatic     #55                 // Field m0:Ljava/lang/reflect/Method;\n       8: aconst_null   \n       9: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;\n      14: checkcast     #57                 // class java/lang/Integer\n      17: invokevirtual #60                 // Method java/lang/Integer.intValue:()I\n      20: ireturn       \n      21: athrow        \n      22: astore_1      \n      23: new           #42                 // class java/lang/reflect/UndeclaredThrowableException\n      26: dup           \n      27: aload_1       \n      28: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V\n      31: athrow        \n    Exception table:\n       from    to  target type\n           0    21    21   Class java/lang/Error\n           0    21    21   Class java/lang/RuntimeException\n           0    21    22   Class java/lang/Throwable\n\n  public final boolean equals(java.lang.Object);\n    Code:\n       0: aload_0       \n       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;\n       4: aload_0       \n       5: getstatic     #20                 // Field m1:Ljava/lang/reflect/Method;\n       8: iconst_1      \n       9: anewarray     #22                 // class java/lang/Object\n      12: dup           \n      13: iconst_0      \n      14: aload_1       \n      15: aastore       \n      16: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;\n      21: checkcast     #30                 // class java/lang/Boolean\n      24: invokevirtual #34                 // Method java/lang/Boolean.booleanValue:()Z\n      27: ireturn       \n      28: athrow        \n      29: astore_2      \n      30: new           #42                 // class java/lang/reflect/UndeclaredThrowableException\n      33: dup           \n      34: aload_2       \n      35: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V\n      38: athrow        \n    Exception table:\n       from    to  target type\n           0    28    28   Class java/lang/Error\n           0    28    28   Class java/lang/RuntimeException\n           0    28    29   Class java/lang/Throwable\n\n  public final java.lang.String toString();\n    Code:\n       0: aload_0       \n       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;\n       4: aload_0       \n       5: getstatic     #65                 // Field m2:Ljava/lang/reflect/Method;\n       8: aconst_null   \n       9: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;\n      14: checkcast     #67                 // class java/lang/String\n      17: areturn       \n      18: athrow        \n      19: astore_1      \n      20: new           #42                 // class java/lang/reflect/UndeclaredThrowableException\n      23: dup           \n      24: aload_1       \n      25: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V\n      28: athrow        \n    Exception table:\n       from    to  target type\n           0    18    18   Class java/lang/Error\n           0    18    18   Class java/lang/RuntimeException\n           0    18    19   Class java/lang/Throwable\n\n  static {};\n    Code:\n       0: ldc           #70                 // String java.lang.Object\n       2: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;\n       5: ldc           #77                 // String equals\n       7: iconst_1      \n       8: anewarray     #72                 // class java/lang/Class\n      11: dup           \n      12: iconst_0      \n      13: ldc           #70                 // String java.lang.Object\n      15: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;\n      18: aastore       \n      19: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;\n      22: putstatic     #20                 // Field m1:Ljava/lang/reflect/Method;\n      25: ldc           #83                 // String java.lang.Runnable\n      27: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;\n      30: ldc           #84                 // String run\n      32: iconst_0      \n      33: anewarray     #72                 // class java/lang/Class\n      36: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;\n      39: putstatic     #50                 // Field m3:Ljava/lang/reflect/Method;\n      42: ldc           #70                 // String java.lang.Object\n      44: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;\n      47: ldc           #85                 // String hashCode\n      49: iconst_0      \n      50: anewarray     #72                 // class java/lang/Class\n      53: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;\n      56: putstatic     #55                 // Field m0:Ljava/lang/reflect/Method;\n      59: ldc           #70                 // String java.lang.Object\n      61: invokestatic  #76                 // Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;\n      64: ldc           #86                 // String toString\n      66: iconst_0      \n      67: anewarray     #72                 // class java/lang/Class\n      70: invokevirtual #81                 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;\n      73: putstatic     #65                 // Field m2:Ljava/lang/reflect/Method;\n      76: return        \n      77: astore_1      \n      78: new           #90                 // class java/lang/NoSuchMethodError\n      81: dup           \n      82: aload_1       \n      83: invokevirtual #93                 // Method java/lang/Throwable.getMessage:()Ljava/lang/String;\n      86: invokespecial #96                 // Method java/lang/NoSuchMethodError."<init>":(Ljava/lang/String;)V\n      89: athrow        \n      90: astore_1      \n      91: new           #100                // class java/lang/NoClassDefFoundError\n      94: dup           \n      95: aload_1       \n      96: invokevirtual #93                 // Method java/lang/Throwable.getMessage:()Ljava/lang/String;\n      99: invokespecial #101                // Method java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V\n     102: athrow        \n    Exception table:\n       from    to  target type\n           0    77    77   Class java/lang/NoSuchMethodException\n           0    77    90   Class java/lang/ClassNotFoundException\n\n  public final void run();\n    Code:\n       0: aload_0       \n       1: getfield      #16                 // Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;\n       4: aload_0       \n       5: getstatic     #50                 // Field m3:Ljava/lang/reflect/Method;\n       8: aconst_null   \n       9: invokeinterface #28,  4           // InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;\n      14: pop           \n      15: return        \n      16: athrow        \n      17: astore_1      \n      18: new           #42                 // class java/lang/reflect/UndeclaredThrowableException\n      21: dup           \n      22: aload_1       \n      23: invokespecial #45                 // Method java/lang/reflect/UndeclaredThrowableException."<init>":(Ljava/lang/Throwable;)V\n      26: athrow        \n    Exception table:\n       from    to  target type\n           0    16    16   Class java/lang/Error\n           0    16    16   Class java/lang/RuntimeException\n           0    16    17   Class java/lang/Throwable\n}\n
Run Code Online (Sandbox Code Playgroud)\n