Casting到从不同的类加载器加载的类时的CastCastException

时间:2012-08-20 12:16:46

标签: java groovy classloader

我编写了一个库,其中一个API方法将Class作为参数,然后在此方法的主体中创建了此类的实例:

void foo(Class scriptClass) {
  Script script = scriptClass.newInstance();
  // do stuff with the script object
}

问题在于,虽然scriptClassScript类的孩子,但ClassCastException scriptClassScript加载的{{1}}不同于{{1}}。解决此类碰撞的常用方法是什么?

2 个答案:

答案 0 :(得分:2)

你不能强制转换,除非它与相同的类,它是同一个Class的实例,因此,由同一个类加载器加载。

常用类加载器

使用已经有groovy.Script的类加载器,这样当任何子类加载器使用此类时,它就是公共类。

使用URLClassLoader时,请使用此构造函数:URLClassLoader(URL[] urls, ClassLoader parent)使脚本使用现有类。

其他类加载器

如果上述内容不可行,则可以使用反射(因为JRE类是常见的)。但请记住,这是很多样板代码,应该保持最低限度。

因此,底线是审核您的类加载器结构并尝试将常用内容放在公共场所

答案 1 :(得分:0)

目前还不清楚你的“scriptClass”是否恰好是“Script”或它的子类。如果是后者,那么你基本上只需要确保在加载“scriptClass”之前由JVM加载“Script”。如果尚未加载“脚本”,那么您的“奇怪”类加载器将自行加载它,从而产生问题。如果已经加载,则在两种情况下都将使用已加载的(通过系统类加载器)版本。