如何以反射方式打印方法体?

问题描述 投票:0回答: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 的反射特性来打印方法体?

java reflection
3个回答
7
投票

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

恐怕有相当大的困难。

首先,原始源代码很可能对正在运行的程序不可用。通常,开发人员不会在二进制 JAR 中包含源代码。 (即使他们这样做,也不能保证他们将是“真实”来源。) 通常可以通过将类的 FQN 转换为字节码文件并使用类类加载器将文件作为资源流加载来获取类的字节码。但不能保证通过这种方式获得的字节码与加载的字节码相同。 (一些类加载器由于各种原因而弄乱了字节码。)

假设您

可以

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

    


5
投票


3
投票

© www.soinside.com 2019 - 2024. All rights reserved.