现在我有
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的反射特性来打印方法体?
答案 0 :(得分:6)
如何添加Java的反射特性来打印方法体?
相当困难,我很害怕。
首先,原始源代码最有可能对正在运行的程序不可用。通常,开发人员不在二进制JAR中包含源代码。 (即使他们这样做,也不能保证他们将成为“真正的”来源。)
通常可以通过将类的FQN转换为字节码文件并使用类classloader将文件作为资源流加载来获取类的字节码。但是不能保证以这种方式获得的字节码与加载的字节码相同。 (由于各种原因,一些类加载器会乱码字节码。)
假设您可以获取真正的字节码,最后一步是将它们显示为原始,或者将它们反汇编或反编译为更具可读性的内容。您应该可以使用javap
进行反汇编,但反编译需要使用第三方产品。当然,反编译的代码看起来与原始代码有很大的不同,如果字节码被混淆了,那么源代码几乎是不可读的。
答案 1 :(得分:4)
Java在运行时没有这些信息。你唯一可以打印的就是字节码。
答案 2 :(得分:1)
执行此类操作的唯一方法是编写/使用反编译器。这涉及直接读取字节码,这不是ReflectionAPI的标准功能。原始源文件中表示的源代码消失了,可能无法完全重现它,因为它来自字节代码。 (例如,泛型会丢失,并且使用增强的for循环也无法区分,我确信还有其他的。)
答案 3 :(得分:-2)
如果要打印的代码是您的代码,您可以发送源代码并使用此答案中的方法代码来提取所需的方法: