如何反射打印方法体?

unj*_*nj2 7 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");
    }
  }
Run Code Online (Sandbox Code Playgroud)

它反射性地打印大多数信息,但创建一个空体.如何添加Java的反射特性来打印方法体?

Ste*_*n C 6

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

我很害怕,相当困难.

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

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

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


Chr*_*her 5

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