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

Java 如何比较类路径上两个类的公共API?,java,classpath,junit4,Java,Classpath,Junit4,在我的项目中,我依赖于org.slf4japi:1.7.2和org.eclipse.equinox:org.eclipse.equinox.http.jetty:2.0.100 Jetty团队中的某个人将两个类org.slf4j.Logger和org.slf4j.LoggerFactory复制到他们的JAR中。谢谢你 现在我在类路径上有两次org.slf4j.Logger。只要它们的公共API相同,这就不是什么大问题 如何编写一个测试来确保两个类文件的公共API相同 EDIT检查带有反射的类看起

在我的项目中,我依赖于
org.slf4japi:1.7.2
org.eclipse.equinox:org.eclipse.equinox.http.jetty:2.0.100

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

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

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

EDIT检查带有反射的类看起来是一个显而易见的解决方案,但是如何加载它们呢?有两个可用的资源
org/slf4j/Logger.class
。如何将原始的
.class
文件转换为可以检查的
java.lang.class


Class.forName()
在我的例子中不起作用,因为那只会给我两个中的一个(我甚至不知道是哪一个)。javap程序列出了类文件的API。你这样称呼它:

javap -classpath [your_classpath] -public org.slf4j.LoggerFactory
这将打印公共成员列表,但您也可以键入
javap-help
查看其他选项


另一种方法是编写一个Java程序,该程序使用反射来列出每个类的API,但我认为这种方法会更简单,并且完全满足您的需要。

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

javap -classpath [your_classpath] -public org.slf4j.LoggerFactory
这将打印公共成员列表,但您也可以键入
javap-help
查看其他选项


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

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


此外,如果只是一次性的,您可以浏览源代码。

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


如果只是一次性的,你可以浏览源代码。

+1 for
javap
。例如,我可以从
ProcessBuilder
开始。有没有一种方法可以在不启动新进程的情况下使用
javap
中的代码?还是
javap
不是用Java编写的?据我所知,
javap
是一个本机可执行文件。编辑:删除了其余部分,我遗漏了一点问题。实际上,
javap
只是加载
tools.jar
,但其中的API(
com.sun.tools.javap.Main
)可能不稳定,也不适用于所有VM。
javap
的+1。例如,我可以从
ProcessBuilder
开始。有没有一种方法可以在不启动新进程的情况下使用
javap
中的代码?还是
javap
不是用Java编写的?据我所知,
javap
是一个本机可执行文件。编辑:删除了其余部分,我遗漏了一点问题。实际上,
javap
只是加载
tools.jar
,但其中的API(
com.sun.tools.javap.Main
)可能不稳定,也不适用于所有VM。