Java 禁用URLClassLoader中的缓存

Java 禁用URLClassLoader中的缓存,java,Java,所以我制作了一个服务器,很像IRC,只是为了了解更多,这是我的问题 我有每个人都可以根据自己的权限调用的命令,每个“命令”都有自己的类,都位于一个目录中。我将所有类加载到HashMap中,如果我添加新命令,一切都会很好,但如果我更改了一个旧命令,则不会有任何更改 那么,如何使用URLClassLoader加载类而不缓存它们呢 谢谢你的帮助 这是我正在使用的代码 ClassLoader loader = new URLClassLoader(scriptURLS); try {

所以我制作了一个服务器,很像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);
ClassLoader=新的URLClassLoader(脚本URL);
试一试{
用于(URL u:ScriptURL){
如果(u==null)继续;
字符串文件名=u.getFile();
int beginIndex=fileName.indexOf(“commands/”)+9;
int endIndex=fileName.indexOf(“.c”);
fileName=fileName.substring(beginIndex,endIndex);
字符串名称=fileName.toLowerCase();
Class c=(Class)loader.loadClass(“chat.commands.+fileName”);

我意识到这不是最干净或最有效的代码,但它可以工作。

您应该非常小心地创建自己的类加载器,因为内存中的循环引用会阻止垃圾收集器回收以前的加载器占用的空间,因此您可能会很快耗尽PermGen空间(如果您决定转储类加载器,并在每次需要重新加载命令时创建一个新的类加载器,则需要注意这一点)。有关如何实现这一点的详细信息,请参见:

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

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

老实说,我不完全理解您的用例(为什么必须在运行时加载命令类,为什么需要热部署行为)