我编写了一个库,其中一个API方法将Class
作为参数,然后在此方法的主体中创建了此类的实例:
void foo(Class scriptClass) {
Script script = scriptClass.newInstance();
// do stuff with the script object
}
问题在于,虽然scriptClass
是Script
类的孩子,但ClassCastException
scriptClass
由Script
加载的{{1}}不同于{{1}}。解决此类碰撞的常用方法是什么?
答案 0 :(得分:2)
你不能强制转换,除非它与相同的类,它是同一个Class的实例,因此,由同一个类加载器加载。
常用类加载器
使用已经有groovy.Script
的类加载器,这样当任何子类加载器使用此类时,它就是公共类。
使用URLClassLoader
时,请使用此构造函数:URLClassLoader(URL[] urls, ClassLoader parent)
使脚本使用现有类。
其他类加载器
如果上述内容不可行,则可以使用反射(因为JRE类是常见的)。但请记住,这是很多样板代码,应该保持最低限度。
因此,底线是审核您的类加载器结构并尝试将常用内容放在公共场所。
答案 1 :(得分:0)
目前还不清楚你的“scriptClass”是否恰好是“Script”或它的子类。如果是后者,那么你基本上只需要确保在加载“scriptClass”之前由JVM加载“Script”。如果尚未加载“脚本”,那么您的“奇怪”类加载器将自行加载它,从而产生问题。如果已经加载,则在两种情况下都将使用已加载的(通过系统类加载器)版本。