Java中的优先级类加载器

时间:2013-12-12 14:11:18

标签: java classloader

我想实现可以执行以下操作的PriorityClassLoader

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

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

PS - 我原来的问题是 - 我想将URL添加到系统类加载器中,但它在系统类加载器和远程JAR中的重复类上开始失败。

2 个答案:

答案 0 :(得分:1)

我偶然发现了这个名为JCL的有趣库,我这样做了:

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 :(得分:0)

要回答这个问题,我从来没有听说过任何现成的解决方案,但可以通过一些自定义类加载器来完成,这是blog post的简化示例:

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();
  }
}

对于原始问题,您是否尝试将库放在endorsed目录中?这是一种JDK标准机制,允许在JVM引导程序类加载器级别添加库。

根据您的服务器,还有其他替代方法可以放置类。如果这些都没有帮助那么最好提供有关原始问题的更多信息。

相关问题