唯一标识一个 Java class 实现

Uniquely identify a Java class implementation

我一直在处理分支不佳的项目,这些项目给我留下了依赖项,其中包括几个具有完全相同的完全限定名称的 classes。因此,我得到了 AbstractMethodError 用于在错误的实现上调用方法。我的解决方案是重命名工作正常的 class 包。

但是,我现在想知道是否有更好的方法——我们可以唯一地标识一个 Java class 实现吗?

您可以查看 OSGI 作为解决方案。您可以指定模块之间的依赖关系,并为每个模块

加载精确的class
如果

类 具有相同的完全限定名称并且由相同的 class 加载程序加载,则它们是相等的。因此,如果您有不同的 class 加载器(并且每个 class 加载器只知道其中一种实现,例如在 OSGi 环境中),理论上您可以通过检查它们对应的 class 加载器来识别它们.

但是,通常有多个 class 具有相同的完全限定名称 的问题,并且如果您可以重命名包。可能会有特殊情况,但你应该有很好的理由。

您可以检查两个 classes(或两个对象的 classes)是否相同:

o1.getClass() == o2.getClass()

当 class 完全相同时(即由相同的 class 加载程序加载),此表达式为 true

据我所知,无法确定运行时 class 是否是从特定文件创建的。

有一个叫做 "ImplementationVersion" 的东西,你可以这样访问:

public class 测试类版本 {

public static void main(String[] args) {
    System.out.println("TestClassVersion: " + TestClassVersion.class.getPackage().getImplementationVersion());
    System.out.println("String: " + String.class.getPackage().getImplementationVersion());
    System.out.println("org.apache.commons.logging.Log: " + org.apache.commons.logging.Log.class.getPackage().getImplementationVersion());
}

}

输出:

TestClassVersion: null
String: 1.8.0_45
org.apache.commons.logging.Log: 1.0.4

这样做的缺点是,必须在编译时在 META-INF\MANIFEST.MF-File(在那里 s calledImplementation-Version`)中设置此版本 - 如果您不这样做指定它将为空。

参见:

https://docs.oracle.com/javase/tutorial/deployment/jar/packageman.html

http://docs.oracle.com/javase/8/docs/api/java/lang/Package.html