繁体   English   中英

如何反射性地打印方法主体?

[英]How do I print the method body reflectively?

现在我有

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

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

恐怕难度很大。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM