gpt4 book ai didi

java - 禁用 URLClassLoader 中的缓存

转载 作者:行者123 更新时间:2023-12-02 08:19:50 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

说实话,我并不完全理解您的用例(为什么必须在运行时加载 Command 类,以及为什么需要热部署行为)。

关于java - 禁用 URLClassLoader 中的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com