首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的优先级类加载器

Java中的优先级类加载器
EN

Stack Overflow用户
提问于 2013-12-12 14:11:17
回答 2查看 1.4K关注 0票数 0

我想实现PriorityClassLoader,它可以执行以下操作:

  • 它接受默认的ClassLoader实例作为构造函数参数。
  • 它有addURL方法,它的工作方式类似于URLClassLoader中的addURL,但是对于每一个新的URL,它都设置了优先级。

当应该加载类时,加载程序将首先尝试使用默认的类加载器(如果不是--根据优先级从提供的URL加载该类)。有没有现成的解决方案?

PS -我最初的问题是遵循-我想添加URL到系统类装入器,但它开始失败的重复类在系统类装入器和远程JAR。

EN

回答 2

Stack Overflow用户

发布于 2013-12-12 14:48:37

我无意中发现了一个名为JCL的有趣的库,我这样做了:

代码语言:javascript
复制
JarClassLoader jcl = new JarClassLoader();
jcl.add(new URL("hive://" + pageURL.getHost() + ":" + pageURL.getPort() + "/" + pageURL.getApplicationName() + "/origJar.jar"));

jcl.getSystemLoader().setOrder(1);
jcl.getThreadLoader().setOrder(2);
jcl.getCurrentLoader().setOrder(3);
jcl.getParentLoader().setOrder(4);
jcl.getLocalLoader().setOrder(5);

Thread.currentThread().setContextClassLoader(jcl);
票数 1
EN

Stack Overflow用户

发布于 2013-12-12 14:26:12

为了回答这个问题,我从未听说过任何现成的解决方案,但是可以由一些定制的类加载器来完成,这是这个博客帖子中的一个简化示例。

代码语言:javascript
复制
public class ExampleFactory {
  public static IExample newInstance() {
    URLClassLoader tmp =
      new URLClassLoader(new URL[] {getClassPath()}) {
        public Class loadClass(String name) {
          if ("example.Example".equals(name))
            return findClass(name);
          return super.loadClass(name);
        }
      };

    return (IExample)
      tmp.loadClass("example.Example").newInstance();
  }
}

对于最初的问题,您是否尝试将库放在核可目录中?这是一种JDK标准机制,允许在JVM引导类加载器级别添加库。

根据您的服务器,还有其他选择来放置类。如果所有这些都没有帮助,那么最好提供更多的原始问题的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20545812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档