Java 我的类加载器有什么问题?ClassCastException在强制转换到同一类时发生!
在任何人关闭之前,这是一个副本,请不要着急,这有点不同:-) 我有一个a级,正在一个SwingWorker中使用。所以,这个程序有点像这样:Java 我的类加载器有什么问题?ClassCastException在强制转换到同一类时发生!,java,classloader,classcastexception,java-7,Java,Classloader,Classcastexception,Java 7,在任何人关闭之前,这是一个副本,请不要着急,这有点不同:-) 我有一个a级,正在一个SwingWorker中使用。所以,这个程序有点像这样: class Task extends SwingWorker { public Task(ClassLoader loader) { Thread.currentThread().setContextClassLoader(loader); } public List<A> doInBac
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;
}
}
类任务扩展SwingWorker{
公共任务(类加载器){
Thread.currentThread().setContextClassLoader(加载器);
}
公共列表doInBackground(){
A obj=新的A();
//用手指做一些事情;
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
}
}
public void someMethod()引发异常{
任务任务=新任务(Thread.getCurrentThread().getContextClassLoader():
//做点什么,然后等待输出
列表结果=task.get();
对于(目标:结果){
//做点什么
}
}
现在,我做了一个java-verbose:class来查看这个类是如何加载的。我可以看到,在执行doInBackground()方法时,只加载了一次。但是,一旦控件返回到someMethod(),列表上的for循环迭代就会抛出一个ClassCastException!!它是这样的:
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;
}
}
线程“AWT-EventQueue-0”java.lang.ClassCastException中出现异常:[Lcom.model.A;无法转换为com.model.A]
我不知道为什么这不起作用。我尝试使用Class.forName()并在someMethod()中预加载类A,在调用SwingWorker之前,在不传递classloader实例的情况下执行此操作时,同一个类被加载了两次!!在将classloader作为param发送后,该类仅被精确加载一次,但拒绝强制转换
需要帮助!:(
您正在尝试将com.model.A[]
实例强制转换为com.model.A
实例
您正在尝试将
com.model.A[]
实例强制转换为com.model.A
实例。我认为系统正在抱怨将数组强制转换为类
*L*com.model.A;无法强制转换为
com.model.A
请在调试模式下运行程序,查看是否使用数组代替对象。我认为系统正在抱怨将数组强制转换为类 *L*com.model.A;无法强制转换为 com.model.A
请在调试模式下运行程序,看看是否使用数组来代替对象。为了清楚起见,sysout打印的数组在类名前面有一个前导的
L
。该死…我不知道-可能是我知道了,但我太盲目了,在这里看不到它。为了清楚起见,sysout打印的数组前面有一个前导的L
在全班同学面前a领先L!该死…我不知道-可能是我知道,但我太瞎了,看不见这里。我不敢相信我为这么愚蠢的事情浪费了5个多小时尝试所有事情!!我不敢相信我为这么愚蠢的事浪费了5个多小时尝试所有事情!!