谈谈ClassLoader
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 @Override 12 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 }