如何反射打印方法体?

时间:2010-05-31 22:33:19

标签: java reflection

现在我有

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的反射特性来打印方法体?

4 个答案:

答案 0 :(得分:6)

  

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

相当困难,我很害怕。

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

执行此类操作的唯一方法是编写/使用反编译器。这涉及直接读取字节码,这不是ReflectionAPI的标准功能。原始源文件中表示的源代码消失了,可能无法完全重现它,因为它来自字节代码。 (例如,泛型会丢失,并且使用增强的for循环也无法区分,我确信还有其他的。)

答案 3 :(得分:-2)

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

getTheCode() method