【问题标题】:custom classLoader issue自定义类加载器问题
【发布时间】:2012-03-24 10:08:35
【问题描述】:

接下来是问题:我从here 获取了基类加载器代码。但是我的 classLoader 从某个角度来说是特定的,它必须能够从文件系统加载类(让我们以 WinOS 为例),所以在 classLoader 中必须有一些 setAdditionalPath() 方法,它设置路径(文件系统上的目录),来自我们将加载类(只有 *.class,没有 jars)。这是代码,它从链接修改加载器(您可以看到,只修改了 loadClass),但它不能正常工作:

public void setAdditionalPath(String dir) {
            if(dir == null) {
                throw new NullPointerException("");
            }

            this.Path = dir;
        }

        public Loader(){
              super(Loader.class.getClassLoader());
        }


        public Class loadClass(String className) throws ClassNotFoundException {
          if(Path.length() != 0) {
            File file = new File(Path);

            try {
                // Convert File to an URL

         URL url = file.toURL();          
                URL[] urls = new URL[]{url};

                // Create a new class loader with the directory
                ClassLoader cl = new URLClassLoader(urls);


                ClassLoader c = cl.getSystemClassLoader();
                Class cls = c.loadClass(className);
                return cls;

            } catch (MalformedURLException e) {

            } catch (ClassNotFoundException e) {

            }

        }
            return findClass(Path);
        }

如果有人提供帮助,我将不胜感激:)

【问题讨论】:

  • 您遇到了什么错误(如果有)。在几乎没有信息的情况下很难进行调试。
  • @Legend 首先我用一个目录设置路径值,其中有一些类。然后我用这个目录中的一个类调用类加载器,但它在其中一些行返回一个 NPE(NullPointerException) ClassLoader cl = new URLClassLoader(urls); ClassLoader c = cl.getSystemClassLoader(); Class cls = c.loadClass(className);
  • 我不能说我的解决方案是正确的。我想要获得的主要结果是我的类加载器将能够从我在方法中设置的文件目录加载类,否则,将调用父类加载器。
  • 不要忽略异常!对于每个catch,添加e.printStackTrace()。盲目地尝试编程是没有好处的。
  • @AndrewThompson 我不会像您在代码中看到的那样忽略它们! NPE 被Class cls = c.loadClass(className); 线抛出

标签: java class url path classloader


【解决方案1】:

您可以使用java.net.URLClassLoader 提供的框架。无需自己编写。它支持从目录和 JAR 文件加载类。

假设任何以“/”结尾的 URL 都指向一个目录。 否则,假定 URL 引用一个 JAR 文件,该文件将被 根据需要打开。

它还支持父类加载器。如果这个类加载器不符合您的要求,也许您可​​以更详细地指定您需要的内容。在任何情况下,您都可以查看源代码并在此基础上派生出您自己的类加载器类。

这是一个简短的工作 sn-p 代码,应该演示如何从 URLClassLoader 按名称加载类:

    ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

    // This URL for a directory will be searched *recursively*
    URL classes =
        new URL( "file:///D:/code/myCustomClassesAreUnderThisFolder/" );

    ClassLoader custom = 
        new URLClassLoader( new URL[] { classes }, systemClassLoader );

    // this class should be loaded from your directory
    Class< ? > clazz = custom.loadClass( "my.custom.class.Name" ); 
    // this class will be loaded as well, because you specified the system 
    // class loader as the parent
    Class< ? > clazzString = custom.loadClass( "java.lang.String" ); 

【讨论】:

  • 所以它是 NPE,因为我设置的路径格式不正确?我试试,谢谢!
  • 我不知道,但您的示例也返回 NPE。
  • 在单元测试中对其进行了测试,运行良好。编辑您的问题发布完整的堆栈跟踪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 2014-09-02
  • 1970-01-01
  • 2016-08-29
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多