2

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

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

问题是 while是我得到scriptClass的类的子类,因为它是由不同的类加载器加载的,而不是. 解决此类冲突的常用方法是什么?ScriptClassCastExceptionscriptClassScript

4

2 回答 2

2

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

通用类加载器

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

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

其他类加载器

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

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

于 2012-08-20T12:45:20.313 回答
0

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

于 2012-08-20T12:46:03.103 回答