Java反射中Class.forName和classloader的區別


Java中Class.forName和classloader都可以用來對類進行加載。

 

Class.forName除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。

而classloader只干一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。

 

Class.forName(name,initialize,loader)帶參數也可控制是否加載static塊。並且只有調用了newInstance()方法采用調用構造函數,創建類的對象。

 

代碼如下:

 1 package com.mangosoft.java.reflect;
 2 
 3 /**
 4  * Created by zhangshengjian on 2017/3/1.
 5  */
 6 public class Line {
 7     static {
 8         System.out.println("static code executing: loading line...");
 9     }
10 }
 1 package com.mangosoft.java.reflect;
 2 
 3 /**
 4  * Created by zhangshengjian on 2017/3/1.
 5  */
 6 public class Point {
 7     static {
 8         System.out.println("static code executing: loading point...");
 9     }
10 }
 1 package com.mangosoft.java.reflect;
 2 
 3 /**
 4  * classloader和Class.forName的區別
 5  *
 6  * Created by zhangshengjian on 2017/3/1.
 7  */
 8 public class ClassLoaderAndForNameTest {
 9 
10     public static void main(String[] args) {
11         String wholeNameLine = "com.mangosoft.java.reflect.Line";
12         String wholeNamePoint = "com.mangosoft.java.reflect.Point";
13 
14         System.out.println("classloader testing...");
15         testClassLoader(wholeNameLine, wholeNamePoint);
16         System.out.println("---------------------------------------");
17         System.out.println("Class.forName testing...");
18         testForName(wholeNameLine, wholeNamePoint);
19     }
20 
21     //classloader
22     public static void testClassLoader(String wholeNameLine, String wholeNamePoint) {
23         ClassLoader loader = ClassLoader.getSystemClassLoader();
24         Class<?> line;
25         Class<?> point;
26         try {
27             line = loader.loadClass(wholeNameLine);
28             point = loader.loadClass(wholeNamePoint);
29             System.out.println("line " + line.getName());
30             System.out.println("point " + point.getName());
31         } catch (ClassNotFoundException e){
32             e.printStackTrace();
33         }
35     }
36 
37     //Class.forName
38     public static void testForName(String wholeNameLine, String wholeNamePoint) {
39         try {
40             Class line = Class.forName(wholeNameLine);
41             Class point = Class.forName(wholeNamePoint);
42             System.out.println("line " + line.getName());
43             System.out.println("point " + point.getName());
44         } catch (ClassNotFoundException e) {
45             e.printStackTrace();
46         }
47     }
48 }

 

運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM