我开始处理一个项目,其中一个任务需要分析源代码,以便收集有关类及其方法的信息。更具体地说,对于每个方法,我需要知道它在整个方法体中使用了哪些内部属性和外部对象(引用)。
我和我的导师讨论过,他们认为字节码操作库是可行的。我已经看过BCEL, ASM和Javassist,但我不确定我需要使用哪一个。它们是否都提供对方法体的访问,以便我可以看到所有指令并获得所需的信息?
如有任何建议,我将不胜感激。谢谢你!如果您真的"需要分析源代码",那么允许检查字节码的库不是正确的选择。
否则,你真的需要精确地定义你的任务。或者,您要分析类,而不管您是否要查看它们的源代码或字节码,或者您想要分析源代码并考虑先编译,然后分析编译的结果。在后一种情况下,您必须将这两个步骤的工作与可选的解决方案进行比较,例如,可以合并直接的源代码分析。
解析字节码相当容易,比分析源代码容易,这就是为什么字节码在Java程序执行之前产生的原因。要回答你的具体问题,是的,这三个库都提供了一种分析说明和相关信息的方法。哪一个最适合你的需求,是一个超出Stackoverflow范围的问题。分析字节码是否有帮助,取决于您的确切需求。当涉及到字段和方法访问时,您可以使用该方法精确地获得它们中的大多数。只有内联编译时常量缺少它们的起源。当涉及到类型使用时,你必须考虑到并不是每个源代码工件在字节码中都有一个现有的对应项,例如,扩展强制转换不会产生实际的代码,并且局部变量通常没有声明的类型(除了调试信息),而只有一个隐含的类型,这取决于它们的实际使用方式。它们也没有关于泛型的信息,除非包含了调试信息。