所以我正在制作一台服务器,就像IRC一样,只是为了了解更多,这就是我的问题。
我有一些命令,每个人都可以根据他们的权限进行调用,每个“命令”都有自己的类,所有这些都位于一个目录中。我将所有类加载到HashMap中,如果我添加新命令,它都可以正常工作,但是如果我更改旧命令,则不会发生任何变化。
那么如何使用URLClassLoader加载类而不缓存它们呢?
感谢您的帮助。
这是我正在使用的代码
ClassLoader loader = new URLClassLoader(scriptURLS);
try {
for(URL u : scriptURLS) {
if(u == null) continue;
String fileName = u.getFile();
int beginIndex = fileName.indexOf("commands/") + 9;
int endIndex = fileName.indexOf(".c");
fileName = fileName.substring(beginIndex, endIndex);
String name = fileName.toLowerCase();
Class<Command> c = (Class<Command>) loader.loadClass("chat.commands."+fileName);
我意识到这不是最干净或效率最高的代码,但它有效。
答案 0 :(得分:0)
您应该非常小心地创建自己的类加载器,因为内存中的循环引用可以快速耗尽PermGen空间,从而阻止垃圾收集器回收先前加载器占用的空间(这是需要注意的事项)如果您决定转储ClassLoader并在每次需要重新加载命令时创建一个新的ClassLoader。有关如何发生这种情况的更多信息:
http://www.zeroturnaround.com/blog/rjc201/
如果你还没有,你应该看看JRebel。有许可费,但我认为它可以解决您的问题:
http://www.zeroturnaround.com/jrebel/
此外,java HotSwap(用于java调试API)可能有钩子来促进您正在寻找的热重新部署行为(通常在IDE环境中可用)。
我没有完全理解你的用例是诚实的(为什么你必须在运行时加载Command类,为什么你需要热部署行为)。