静态检查Java应用程序是否存在链接错误

时间:2010-05-25 11:34:23

标签: java reflection static-analysis backwards-compatibility bytecode-manipulation

我有一个场景,我有一个针对库的版本1编写的代码,但我想发送库的版本2。代码已发货,因此无法更改。我担心它可能会尝试访问v1中存在但已在v2中删除的库的类或成员。

我认为可以编写一个工具来进行简单检查,看看代码是否会链接到较新版本的库。我很欣赏即使代码链接,代码仍可能非常破碎。我从另一方面思考这个问题 - 如果代码没有链接,那么我可以确定存在问题。

据我所知,我需要通过字节码检查对库类的引用,方法调用和字段访问,然后使用反射来检查类/成员是否存在。

我有三个问题:

(1)这样的工具是否已存在?

(2)我有一种琐碎的感觉,我想象的复杂得多,我错过了一些重要的事情 - 是这样的吗?

(3)你知道一个方便的库,它允许我检查字节码,以便我可以找到方法调用,引用等。

谢谢!

5 个答案:

答案 0 :(得分:2)

更改IDE中的库将导致所有可能的编译时错误。

您不需要任何其他内容,除非您的代码使用其他库,而该库又使用更新的库。

答案 1 :(得分:2)

我认为Clirr - 二进制兼容性检查器 - 可以在这里提供帮助:

  

Clirr是一个检查Java库以获得与旧版本的二进制和源兼容性的工具。基本上你给它两组jar文件,Clirr转储出公共api中的变化列表。可以将Clirr Ant任务配置为在检测到不兼容的api更改时中断构建。在持续集成过程中,Clirr可以自动防止意外引入二进制或源兼容性问题。

答案 2 :(得分:1)

要特别警惕Spring配置文件。类名称配置为 text ,并且在运行时之前不会显示为缺失。

答案 3 :(得分:0)

如果您有权访问源代码,则可以针对新库编译源代码。如果它没有编译,你肯定有问题。如果它编译,如果程序使用反射,某些类似IoC的东西,比如Spring等,你可能仍有问题。

如果您有单元测试,那么您可能会有更好的更改来捕获任何链接错误。

如果你只有一个程序的.class文件,那么我不知道除了装饰类文件之外还有什么工具可以帮助再次对新库进行源代码和编译,但这听起来不太健康

答案 4 :(得分:0)

您提到的检查由JVM / Java类加载器完成,请参阅例如Linking of Classes and Interfaces

因此,尝试运行应用程序可以简单地实现“尝试链接”。当然,您可以提升检查以在您的.class / .jar文件集合上自行运行它们。我想像BCEL这样的第三方字节代码操作符也会为你做类似的检查。

我注意到你在标签中提到反射。如果通过反射加载类/调用方法,通常无法对此进行分析。

祝你好运!