似乎java的reflaction需要将符号表编译到类文件中。 但是为了提高性能,在运行时,我们通常会将其删除。(我不懂Java,在C++中,我们真的把它移到了生产主管中)。
我的问题是,如果我删除符号表,这是否意味着某些库(例如 Spring)将无法正常运行?
附言:
来自 Professional Eclipse 3 for Java™Developers by Berthold Daum
类文件和 JDK 合规性 在"合规性和类文件"页面上,您 可以指定哪些符号信息,例如变量名和 行号,将包含在生成的类文件中。此信息是必需的 调试,因此您可能希望保持建议的设置不变。但是,对于经过良好测试的程序,从类文件中删除此信息可能是有意义的;生成的文件是 如果没有符号表,则要小得多。
通常,很难知道反射代码可能使用和不使用的内容。 像 Spring 这样的框架可能会使用运行时可用的调试信息。
例如,以 Spring 的@PreAuthorize
和相关注释为例。 在文档中,我们看到以下内容:
可以按名称访问任何方法参数作为表达式变量,前提是代码中编译了调试信息。
因此,在编译后删除调试信息所采取的任何步骤都必须经过彻底测试,或者必须知道您的代码不包含上述模式。
但请注意,标准 Java 反射库不提供此反射。 有关如何在 Java 中完成此操作的更多信息,请参阅此答案。