
JVM启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去。此外,它也可以加载其他的资源,比如配置文件、图片等等。
所以他和FileReader很像,只不过返回值不一样。
获得ClassLoader的几种方法
-
this.getClass.getClassLoader();
// 使用当前类的ClassLoader -
Thread.currentThread().getContextClassLoader();
// 使用当前线程的ClassLoader -
ClassLoader.getSystemClassLoader();
// 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。
用ClassLoader载入资源的几种方法
-
类的载入方式
- 使用Class静态方法 Class.forName
Class cls = Class.forName("com.alexia.B"); B b = (B)cls.newInstance();
- 使用 ClassLoader
/* Step 1. Get ClassLoader */ ClassLoader cl = this.getClass.getClassLoader();; // 如何获得ClassLoader参考1 /* Step 2. Load the class */ Class cls = cl.loadClass("com.alexia.B"); // 使用第一步得到的ClassLoader来载入B /* Step 3. new instance */ B b = (B)cls.newInstance(); // 有B的类得到一个B的实例
- 直接 new
B b = new B();
-
文件的载入方式(例如配置文件等)
假设想读取文件夹 /com/alexia/config 里的文件sys.properties文件- 直接用IO流读取
如果是属性配置文件,也可以通过java.util.Properties.load(is)
将内容读到Properties里。
File f = new File("C:/test/com/aleixa/config/sys.properties"); // 使用绝对路径 InputStream is = new FileInputStream(f);
- 使用ClassLoader
InputStream is = null; is = this.getClass().getClassLoader().getResourceAsStream( "com/alexia/config/sys.properties"); //方法1 //is = Thread.currentThread().getContextClassLoader().getResourceAsStream( "com/alexia/config/sys.properties"); //方法2 //is = ClassLoader.getSystemResourceAsStream( "com/alexia/config/sys.properties"); //方法3
- 使用ResourceBundle
- 直接用IO流读取
-
Web资源的载入方式
在web应用里当然也可以使用ClassLoader来载入资源,但更常用的情况是使用ServletContext.getResource()
我们编写的java程序是如何运行的,我们自己编写的各种类是如何被加载到jvm(java虚拟机)中去的?
参考资料:
Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
一看你就懂,超详细java中的ClassLoader详解
网友评论