2010-05-31 69 views
3

现在我有如何反射打印方法体?

private static void getMethods(Class<? extends Object> clazz) { 
    Method[] declaredMethods = clazz.getDeclaredMethods(); 
    for (Method aMethod : declaredMethods) { 
     aMethod.setAccessible(true); 

     // Print the declaration 
     System.out.print(Modifier.toString(aMethod.getModifiers()) + " " 
      + aMethod.getReturnType().getSimpleName() + " " + aMethod.getName()); 

     // Get Parameter Types 
     getParameters(aMethod); 

     //Empty Body 
     System.out.println("{}\n"); 
    } 
    } 

哪些反思打印最多的信息,但创建一个空的机构。如何添加Java的反射本质以打印方法体?

回答

5

如何添加Java的反射本质来打印方法体?

我相当困难,恐怕。

首先,原始源代码很可能对正在运行的程序不可用。通常,开发人员不在二进制JAR中包含源代码。 (即使他们这样做,也不保证他们将成为“真正”来源。)

通常可以通过将类的FQN转换为字节码文件并使用类来获取该类的字节码类加载器将文件作为资源流加载。但不能保证你以这种方式获得的字节码将与加载的字节码相同。 (一些乱七八糟的类加载器与周围的字节码出于各种原因。)

假设你可以得到真正的字节码,最后一步将是要么显示这些原料,或拆解或反编译他们的东西更具可读性。您应该可以使用javap进行反汇编,但反编译需要使用第三方产品。当然,反编译后的代码与原始代码看起来有很大不同,如果字节代码被混淆了,他们的源代码将几乎不可读。

4

Java在运行时没有这些信息。你可以打印的唯一东西就是字节码。

+0

....它甚至没有保证你将能够抓住他们。 – 2016-04-17 00:27:51

1

做这种事情的唯一方法是编写/使用反编译器。这涉及直接读取字节码,这不是ReflectionAPI的标准功能。原始源文件中表示的源代码已不存在,并且可能无法像字节码那样完全重现该源代码。 (例如,泛型会丢失,并且使用增强型for循环将无法区分,我相信还有其他的)。

0

如果你要打印的代码是你的,你可以运送的来源和使用的方法代码这个答案提取所需的方法:

getTheCode() method