在任何人关闭之前这是重复的,请握住你的马,这有点不同:-)
我有一个在 SwingWorker 中使用的 A 类。所以,程序有点像这样:
class Task extends SwingWorker {
public Task(ClassLoader loader) {
Thread.currentThread().setContextClassLoader(loader);
}
public List<A> doInBackground() {
A obj = new A();
//do some stuff with A;
return list of A;
}
}
我调用此任务的方法如下所示:
public void someMethod() throws Exception {
Task task = new Task(Thread.getCurrentThread().getContextClassLoader():
//do something and wait for output
List<A> result = task.get();
for(A obj : result) {
//do something
}
}
现在,我做了一个 java -verbose:class,看看这个类是如何被加载的。我可以看到 A 在执行 doInBackground() 方法时只加载一次。但是,一旦控制返回到 someMethod(),列表上的 for 循环迭代就会抛出 ClassCastException!它是这样的:
线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: [Lcom.model.A; 无法转换为 com.model.A]
我不知道为什么这不起作用。在调用 SwingWorker 之前,我尝试使用 Class.forName() 并在 someMethod() 中预加载类 A,同时在不传递类加载器实例的情况下执行此操作,同一个类被加载了两次!!将类加载器作为参数发送后,该类仅被精确加载一次,但拒绝强制转换!!
需要帮忙!:(