自定义classLoader问题

接下来的问题是:我从这里获取了基类classLoader代码。 但是我的classLoader是特定的,它必须能够从文件系统加载类(让我们拿WinOS),所以在classLoader中必须是一些setAdditionalPath()方法,它设置一个路径(文件系统上的一个目录),来自我们将加载类(仅* .class,没有jar)。 这里是代码,它从链接修改加载器(你可以看到,只修改了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); } 

我很感激,如果有人帮助:)

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

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

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

这是一段简短的代码片段,应该说明如何从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" );