Kil*_*ahn 6 java proxy-classes cglib
我有一个在JVM中运行时生成的代理(生成为JDKProxy或CGLIB).我想知道是否有办法将这个类的内容(看起来像com.sun.proxy $ Proxy123.class)写入一个文件,以便我可以使用像反编译器这样的jd-eclipse来查看代码的类型产生.由于该类存在于JVM中,我想知道是否有一种方法可以让ClassLoader向实际类提供一个InputStream/URL,然后可以用来将内容写入磁盘 - 而这个文件位于磁盘上可以使用jd-eclipse或javap读取.我知道这不是一个生产用例,但我很想看到这个动态生成的类的内容.
谢谢!
您可以使用Instrumentation来注册具有重新转换功能的类ClassFileTransformer并请求重新转换该类Proxy。然后,在 Transformer\xe2\x80\x99stransform方法中,您可以使用构成该类的字节数组。将数组保存到类文件后,您只需返回未修改的数组即可让 JVM 继续运行而不受影响。
但我\xe2\x80\x99m 不确定你对这些类的期望是什么。它们的实施是直接的,不会带来任何意外。以下是在使用 Oracle javap\xe2\x80\x99s jdk1.7.0_40 生成的文件上执行上述步骤后的 \ xe2\x80\x99s输出示例:java.lang.Runnable Proxy
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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |