我的目标是什么:
重新连接线程并使用其存储的数据
问题是什么:
尝试投射同一个物体时获得施法异常
错误:
java.lang.ClassCastException
堆栈跟踪:
[11:16:33 WARN]: java.lang.ClassCastException:
com.deadmen.bukkit.persistence.main.Main$CoolData cannot be cast to
com.deadmen.bukkit.persistence.main.Main$CoolData
我已经证明,只要使用线程安全访问字段,这将在概念中起作用。我认为这与游戏服务器重新加载插件,卸载java类然后重新加载它们有关。但这并不能成为为什么不能识别班级序列化的原因。
代码:
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin {
public static final String name = "CoolData1";
public void onEnable() {
CoolData d;
try {
if((d = CoolData.retrievePersistentObject(name))!= null) {
System.out.println("CoolData, " + name+", was found with the message " + d.data);
}else {
new CoolData(name,"Hello, World!").start();
System.out.println("Created new CoolData");
}
}catch(Exception e) {System.out.println("Error Caught"); e.printStackTrace();}
}
public static class CoolData extends Thread {
public String data;
public CoolData(String name, String s) {
this.setName(name);
data = s;
}
public void run() {
while(true) {
try {
Thread.sleep(10000000);
}catch(Exception e) {break;}
}
}
public void end() {this.interrupt();}
public static CoolData retrievePersistentObject(String name){
try {
for(Thread t: Thread.getAllStackTraces().keySet()) {
if(t.getName().contains(name)) {
System.out.println("Thread Found!");
try {
CoolData d = (CoolData)t;
return d;
}catch(Exception e) {e.printStackTrace();}
return new CoolData("blah","failed!");
}
}
}catch(Exception e) {e.printStackTrace();}
return null;
}
}
}
答案 0 :(得分:0)
所以我通过查看java.lang.Thread的方法来解决这个问题,并发现它依赖于类加载器。然后我遇到了this。似乎我需要使用反射来获取数据,否则它是不可能的。