我一直在处理分支不佳的项目,这些项目给我带来了依赖性,包括几个具有完全相同的完全限定名称的类。因此,我在错误的实现上调用方法AbstractMethodError
。我的解决方案是重命名工作正常的类包。
但是,我现在想知道是否有更好的方法 - 我们可以唯一地识别Java类实现吗?
答案 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