强制转换为从其他类加载程序加载的类时发生CastCastException



我写了一个库,它的一个API方法以Class为参数,然后在这个方法的主体中创建这个类的实例:

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

问题是,当scriptClassScript类的子类时,我得到ClassCastException,因为scriptClass是由与Script不同的类加载器加载的。解决此类碰撞的常用方法是什么?

您不能强制转换,除非它的类是相同的,它是class的相同实例,因此由相同的类加载器加载。

普通类加载器

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

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

其他类加载器

如果以上不可行,可以使用反射(因为JRE类很常见)。但请记住,这是大量的样板代码,应该尽量减少。

因此,底线是检查类加载器结构,并尝试将常见的东西放在常见的地方

目前还不清楚您的"scriptClass"究竟是"Script"还是它的一个子类。如果是后者,那么您基本上只需要确保"Script"已由JVM加载,然后再加载您的"scriptClass"。如果"Script"还没有加载,您的"奇数"类加载程序将自己加载它,从而产生问题。如果已经加载,则在这两种情况下都将使用(由系统类加载程序)已经加载的版本。

相关内容

  • 没有找到相关文章

最新更新