带有线程的Java ClassCastException

时间:2015-01-24 17:42:39

标签: java multithreading plugins casting bukkit

我的目标是什么: 重新连接线程并使用其存储的数据 问题是什么: 尝试投射同一个物体时获得施法异常
错误: 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;
    }
}
}

1 个答案:

答案 0 :(得分:0)

所以我通过查看java.lang.Thread的方法来解决这个问题,并发现它依赖于类加载器。然后我遇到了this。似乎我需要使用反射来获取数据,否则它是不可能的。