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。