在URLClassLoader中禁用缓存

时间:2011-07-21 01:29:49

标签: java

所以我正在制作一台服务器,就像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);

我意识到这不是最干净或效率最高的代码,但它有效。

1 个答案:

答案 0 :(得分:0)

您应该非常小心地创建自己的类加载器,因为内存中的循环引用可以快速耗尽PermGen空间,从而阻止垃圾收集器回收先前加载器占用的空间(这是需要注意的事项)如果您决定转储ClassLoader并在每次需要重新加载命令时创建一个新的ClassLoader。有关如何发生这种情况的更多信息:

http://www.zeroturnaround.com/blog/rjc201/

如果你还没有,你应该看看JRebel。有许可费,但我认为它可以解决您的问题:

http://www.zeroturnaround.com/jrebel/

此外,java HotSwap(用于java调试API)可能有钩子来促进您正在寻找的热重新部署行为(通常在IDE环境中可用)。

我没有完全理解你的用例是诚实的(为什么你必须在运行时加载Command类,为什么你需要热部署行为)。