如何比较类路径上两个类的公共API?

时间:2013-02-22 10:09:30

标签: java classpath junit4

在我的项目中,我依赖org.slf4j-api:1.7.2org.eclipse.equinox:org.eclipse.equinox.http.jetty:2.0.100

Jetty团队中的某人将两个类org.slf4j.Loggerorg.slf4j.LoggerFactory复制到他们的JAR中。 谢谢你

现在我在类路径上有org.slf4j.Logger 两次。只要它们的公共API相同,那就不是巨大的问题。

如何编写测试以确保两个类文件的公共API相同?

编辑使用反射检查类看起来是一个明显的解决方案但是如何加载它们?有两种资源org/slf4j/Logger.class可用。如何将原始.class文件转换为我可以检查的java.lang.Class

Class.forName()在我的情况下不起作用,因为那只会给我两个中的一个(我甚至不知道哪一个)。

2 个答案:

答案 0 :(得分:1)

javap程序列出了类文件的API。你这样称呼它:

javap -classpath [your_classpath] -public org.slf4j.LoggerFactory

这将打印公共成员列表,但您也可以键入javap -help以查看其他选项。

另一种方法是编写一个Java程序,它使用反射来列出每个类的API,但我认为这种方法更容易,并且完全符合您的需要。

答案 1 :(得分:0)

您可以通过名称及其参数来反思获取公共方法并对其进行比较。这将是相当混乱的,但它可以进行测试。

此外,如果它只是一次性的事情,你可以浏览资源。