1.简易自定义类加载器
自定义一个类去继承URLClassLoader类 重写其中的构造器
public class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
}
然后就可以去使用了
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException {
File file = new File("E:\\classloadertest");//这是类加载器扫描的根路径
URL[] urls = {file.toURI().toURL()};
//使用自己的类加载器
MyClassLoader classLoader =
new MyClassLoader(urls, null);//null 设置不用父类 打破双亲委派,也可以用 就会连父
//类的扫描路径也会去看
Class<?> aClass = classLoader.loadClass("Hellow");//会按根路径加这个路径去
//找 注意 :就算找到了如果package不对的话会报错
System.err.println(aClass.getClassLoader());
System.err.println(aClass.getClassLoader().getParent());
System.err.println(aClass.getName());
}
这是在E:\\classloadertest 里有各Hellow.class文件 如果这个源码的包不对的话会报错
这是路径下的源码
package text;
public class Hellow {
public int a=10;
static {
System.out.println("static");
}
public Hellow() {
System.out.println("Hellow()");
}
}
这时候就会报错
Exception in thread "main" java.lang.NoClassDefFoundError: Hellow (wrong name: text/Hellow)
如果是.loadClass("text.Hellow") 并且在电脑上 这个.class文件也在路径下的text文件夹里 package也对的上 那就不会报错,结果如下
com.example.tests.classloader.MyClassLoader@3cd1a2f1
null
text.Hellow
2.自定义类加载器
自定义一个类去继承ClassLoader类 重写方法protected Class<?> findClass(String className) throws ClassNotFoundException
public class MyClassLoader2 extends ClassLoader{
private String baseDir;
//利用构造函数传入要扫描的路径
public MyClassLoader2(String baseDir){
this.baseDir=baseDir;
}
@Override
protected Class<?>