唯一标识Java类实现

时间:2015-07-22 12:46:26

标签: java classloader

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

但是,我现在想知道是否有更好的方法 - 我们可以唯一地识别Java类实现吗?

4 个答案:

答案 0 :(得分:0)

您可以将OSGI检查为解决方案。您可以指定模块之间的依赖关系并为每个模块加载精确的类

答案 1 :(得分:0)

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

但是,通常情况下,具有相同完全限定名称​​的多个类是问题,如果您可以重命名包,则实际上没有其他解决方案可以实现。可能有特殊情况,但你应该有很好的理由。

答案 2 :(得分:0)

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

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

当类相同时(即由相同的类加载器加载),此表达式恰好为true

AFAIK无法确定运行时的类是否是从特定文件创建的。

答案 3 :(得分:0)

有一种称为" ImplementationVersion"你可以这样访问:

公共类TestClassVersion {

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 - 文件(那里s called实施 - 版本`)中设置此版本 - 如果你不这样做的话指定它将为null。

请参阅:

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

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