如何reflection打印方法体?

现在我有

private static void getMethods(Class 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"); } } 

其中reflection性地打印大多数信息但创建了空体。 如何添加Java的reflection特性来打印方法体?

如何添加Java的reflection特性来打印方法体?

我很害怕,相当困难。

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

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

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

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

做这样的事情的唯一方法是编写/使用反编译器。 这涉及直接读取字节码,这不是ReflectionAPI的标准function。 原始源文件中表示的源代码已经消失,并且可能无法完全重现它,因为它来自字节代码。 (例如,generics将丢失,并且使用增强的for循环将无法区分,我确信还有其他的)。

如果要打印的代码是您的代码,则可以发送源代码并使用此答案中的方法代码来提取所需的方法:

getTheCode()方法