问题描述
|
当Java(或任何能够反映语言的语言)输出程序时,它是否将方法名称保留为字节码内的字符串?
我想知道在没有这种情况的情况下如何进行以下操作:
Class c = Class.forName(\"foo\");
Method m[] = c.getDeclaredMethods();
字节码会包含类中每个方法字段和名称的字符串吗?我想知道,因为我想确保在不混淆所有内容的情况下,不容易阅读代码的所有部分。如果我对反思的理解存在根本性的错误,请告诉我。
解决方法
首先,方法,字段和类名称以明文形式存储在.class文件中。
其次,除了反思之外,还有一些Java反编译器可以从字节码中恢复几乎可读的代码。
第三,如果要保护代码,请使用混淆处理。有几种流行的Java混淆器。
, 是的,每个字段都将包含全名。如果要混淆代码,则需要使用混淆程序(尽管这也不完全安全,但可以在运行时轻松读取它们)。
, 如前面的答案所提到的,当Java被翻译/编译为Java字节码(一个“ Java程序”)时,ids。被存管。
由于您提到“其他语言”:
如果它们针对相同的Java虚拟机,则这些语言还将生成带有名称的Java字节码。
我不确定,但是,我相信\“。NET \\”语言不会直接在其程序中生成id \,并且有Java和J.V.M新版本的建议或原型。 (Java 7,Java 8),以使用数字或代码代替纯名称,以确保安全性并使程序更快和更优化。
有一本(数字/印刷)书:“ Java虚拟机规范”,其中字节码提到了类ID。如果您有兴趣,我认为您仍然可以从Sun-Oracle免费下载,或在Amazon购买。