似乎java的reflaction需要将符号表编译到类文件中。但是对于性能考虑,在运行时我们通常将其删除。 (我不知道java,在c ++中,我们真的将其移出生产主管)。
我的问题是,如果我删除符号表,这是否意味着某些库,如spring将无法正常工作?
PS:
来自Berthold Daum的Java™开发人员专业Eclipse 3的
Classfiles和JDK合规性在合规性和& Classfiles页面你 可以指定哪些符号信息,例如变量名称和 行号,将包含在生成的类文件中。此信息是必需的 调试,因此您可能希望保持建议的设置不变。但是,对于一个经过良好测试的程序,从类文件中删除这些信息可能是有意义的;生成的文件是 没有符号表的情况要小得多。
答案 0 :(得分:3)
一般来说,很难知道反射代码可能会使用和不使用。像Spring这样的框架可能会使用运行时可用的调试信息。
举个例子,拿Spring的@PreAuthorize
和相关的注释。在documentation中,我们看到以下内容:
如果代码中包含编译的调试信息,则可以按名称访问任何方法参数作为表达式变量。
因此,您必须彻底测试在编译后删除调试信息的任何步骤,或者必须知道您的代码不包含上述模式。
但请注意,标准Java Reflection库不提供此反射。有关如何在Java中完成此操作的更多信息,请参阅this answer。