classloader的作用到本质再到种类
-
BootStrapClassLoader:作用主要是加载核心库Java.*,通常这些核心类的Class被签名不能被替换掉。它是由JVM内核实现的,在HotSpot VM及目前主要的java虚拟机中是用C++实现的。有了它加载最核心的内容才会有后面的ClassLoader存在。
-
ExtClassLoader:Java编写,加载扩展库Javax.*。这个ClassLoader是用户可见的,是用来加载位于jre/lib/ext目录下的jar包。用户也可以将自定义的jar包放到这个目录下,通过这个ClassLoader去加载。
-
AppClassLoader:Java编写,加载程序所在目录。也是用户可见的ClassLoader。它是用来加载class path下的内容。
-
自定义ClassLoader:Java编写,定制化加载。
demo:
1 public class MyClassLoader extends ClassLoader { 2 private String path; 3 private String classLoaderName; 4 5 public MyClassLoader(String path, String classLoaderName) { 6 this.path = path; 7 this.classLoaderName = classLoaderName; 8 } 9 10 //用于寻找类文件11 @Override12 public Class findClass(String name) {13 byte[] b = loadClassData(name);14 return defineClass(name, b, 0, b.length);15 }16 17 //用于加载类文件18 private byte[] loadClassData(String name) {19 name = path + name + ".class";20 InputStream in = null;21 ByteArrayOutputStream out = null;22 try {23 in = new FileInputStream(new File(name));24 out = new ByteArrayOutputStream();25 int i = 0;26 while ((i = in.read()) != -1) {27 out.write(i);28 }29 } catch (Exception e) {30 e.printStackTrace();31 } finally {32 try {33 out.close();34 in.close();35 } catch (Exception e) {36 e.printStackTrace();37 }38 }39 return out.toByteArray();40 }41 }
1 public class ClassLoaderChecker {2 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {3 MyClassLoader m = new MyClassLoader("路径", "classloader名");4 Class c = m.loadClass("类名");5 c.newInstance();6 }7 }