誰かが閉じる前に、これはこれの複製です、あなたの馬を持ってください、これは少し異なります:-)
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を実行して、このクラスがどのようにロードされるかを確認しました。doInBackground()メソッドの実行中にAが1回だけロードされることがわかります。ただし、コントロールがsomeMethod()に戻ると、リストに対するforループの反復によりClassCastExceptionがスローされます。こんなふうになります:
スレッド「AWT-EventQueue-0」の例外java.lang.ClassCastException:[Lcom.model.A; com.model.Aにキャストできません]
なぜこれが機能しないのかわかりません。SwingWorkerを呼び出す前に、Class.forName()を使用してクラスAをsomeMethod()でプリロードしようとしましたが、クラスローダーインスタンスを渡さずにこれを実行すると、同じクラスが2回ロードされていました!! クラスローダーをparamとして送信した後、クラスは1回だけ正確にロードされますが、キャストを拒否します。
助けが必要!:(