现在我有

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

最佳答案



恐怕很难。

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

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

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

10-05 19:11