从类文件中读取一行代码

时间:2011-11-05 13:49:57

标签: java reflection

给定StackTraceElement.getLineNumber(),是否有办法从已编译的类文件中读取此行的内容?即使可以匹配该行,类编译器的内容是否会被编译器“混淆”?

例如,如果我有:

public void myMethod () {
    MyObj m = new MyObj ();   // can I reconstruct this line as String?
}

3 个答案:

答案 0 :(得分:4)

代码不包含在编译的类文件中,该文件包含字节码;所以不,只能从类文件中工作,你无法重建那行代码。当然,可以对Java字节码进行反编译,并且一个足够精心构建的反编译器可能会或多或少地重构该代码行,但是你必须有一个像样的反编译器。最终结果可能看起来与原始源代码非常相似,具体取决于优化等。

答案 1 :(得分:1)

您可以将源文件包含在war / jar文件中,您可以将其作为文件读取。字节码只包含行号而不是实际代码

答案 2 :(得分:1)

您可以从类文件(Foo.class)中检索字节码指令,但不能从表示源代码的String中检索字节码指令。但是,给定源文件和行号,您可以使用标准文件读取技术从源文件(Foo.java)中读取该行。

要了解.class文件中包含的信息类型,请查看javap工具。我认为技术上你可以对编译到该类的源进行最佳猜测,或者在其上运行反编译器,但行号不完全匹配,格式化将完全不同,也许至关重要的是,没有评论或使用源保留级别的注释。