因为类加载器而导致ClassCastException?

在使用类加载器时,我遇到以下exception:

Exception in thread "main" java.lang.ClassCastException: xxx.Singleton cannot be cast to xxx.Singleton 

这是否意味着类加载器中的实例不能转换为另一个类加载器的类?

检查我的代码,我可以通过类加载器实现3个单例,即使是“”安全性。

 public static void main(String[] args) throws Exception { URL basePath = new URL("file:/myMavenPath/target/classes/"); Object instance = getClassInstance(Singleton.class); System.out.println(instance); // Object instance2 = getClassInstance( new URLClassLoader( new URL[]{basePath} , null ) .loadClass("my.Singleton") ); System.out.println(instance2); // Object instance3 = getClassInstance( new URLClassLoader( new URL[]{basePath} , null ) .loadClass("my.Singleton") ); System.out.println(instance3); // Only the 1st cast is ok Singleton testCast1 = (Singleton) instance; System.out.println("1st cast ok"); Singleton testCast2 = (Singleton) instance2; System.out.println("2nd cast ok"); Singleton testCast3 = (Singleton) instance3; System.out.println("3rd cast ok"); } private static Object getClassInstance(Class clazz) throws Exception { Method method = clazz.getMethod("getInstance"); method.setAccessible(true); return method.invoke(null); } class Singleton { private static final Singleton INSTANCE = new Singleton(); public static Singleton getInstance() { return INSTANCE; } private Singleton() { Exception e = new Exception(); StackTraceElement[] stackTrace = e.getStackTrace(); if (!"".equals(stackTrace[1].getMethodName())) { throw new IllegalStateException("You shall not instanciate the Singleton twice !",e); } } public void sayHello() { System.out.println("Hello World ! " + this); } } 

你不能在类加载器之间进行转换。 类标识由完全限定名称和类加载器组成。 检查class级身份孤岛危机

是的,你是对的。

这通常发生在OSGi项目中,因为糟糕的依赖管理。

情况确实如此。 您不能在不同类加载器加载的类之间使用转换。

这个问题,“跨越类加载器”可能会让事情变得清晰……