2012-03-06 123 views
1

问题是下一步:我从here拿到基类加载程序代码。但是我的classLoader从某个角度来说是特定的,它必须能够从文件系统加载类(让我们来看看WinOS),所以在classLoader中必须使用一些方法,它设置一个路径(文件系统上的一个目录),我们将加载类(只有* .class,没有罐子)。这里是代码,它从一个链接修改装载机(你可以看到,只有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); 
     } 

我会感激,如果有人可以帮助:)

+0

什么错误(S)。用很少的信息来调试它可能很困难。 – 2012-03-06 21:18:13

+0

@Legend首先我设置一个目录的路径值,其中有一些类。然后我用这个目录中的一个类调用classloader,但是它在这些行的某些行中返回一个NPE(NullPointerException)'ClassLoader cl = new URLClassLoader(urls); ClassLoader c = cl.getSystemClassLoader(); Class cls = c.loadClass(className);' – pikachu 2012-03-06 21:36:49

+0

我不能说我的解决方案是正确的。我想要获得的主要结果是我的类加载器将能够从我在该方法中设置的文件目录中加载类,否则将调用父类加载器。 – pikachu 2012-03-06 22:07:36

回答

1

您可以使用提供的框架java.net.URLClassLoader。没有必要写你自己的。它支持从目录和JAR文件加载类。

任何以'/'结尾的URL都被认为是指向一个目录。 否则,假定该URL是指根据需要打开的将为 的JAR文件。

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

这里是简短的代码片段工作应该demostrate如何通过名称从一个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"); 
+0

因此它是NPE,因为我以不正确的格式设置路径?我会尽力的,谢谢! – pikachu 2012-03-08 06:47:32

+0

我不知道,但你的例子也返回NPE。 – pikachu 2012-03-10 19:38:05

+0

在单元测试中测试过,运行得很好。在完整的堆栈跟踪后编辑您的问题。 – Strelok 2012-03-11 11:43:29