1. 程式人生 > >簡單談談我對Java 中 Class.forName()、Class.class、例項物件.getClass() 三種獲取位元組碼物件的理解?(內含程式碼分析和總結)

簡單談談我對Java 中 Class.forName()、Class.class、例項物件.getClass() 三種獲取位元組碼物件的理解?(內含程式碼分析和總結)

首先得明白的知識點:

1靜態屬性初始化載入類的時候初始化( 只會初始化一次),而非靜態屬性的初始化就是new類例項物件的時候初始化的 2三種獲取位元組碼物件的共同點就是都會預先的判斷記憶體是否已經載入此類,弱沒有載入,則會把.class檔案裝入到記憶體,若是載入了,則會根據class檔案生成例項物件

談談 我對Java 中 Class.forName()、Class.class、例項物件.getClass() 三者的理解?

1Class.class 的形式會使 JVM 將使用類裝載器將類裝入記憶體(前提是類還沒有裝入記憶體),不做類的初始化工作(靜態初始化和動態初始化都不會做),返回 Class 物件。
 1 public class Demo01 {
 2 public static void main(String[] args) {
 3 //Class.class的方式
 4 Class<DemoClass> clazz = DemoClass.class;
 5 System.out.println(clazz);
 6 }
 7 }
 8 
 9 
10 class DemoClass{
11 //1建構函式
12 public DemoClass() {
13 System.out.println("我是建構函式");
14 }
15 
16 //2靜態程式碼塊
17 static { 18 System.out.println("我是靜態程式碼塊"); 19 } 20 21 //3非靜態程式碼塊 22 { 23 System.out.println("我是非靜態程式碼塊"); 24 } 25 } 26 27 Result: 28 class com.zhuhuicong.classobject.DemoClass
View Code

2Class.forName(該類的許可權定名) 的形式會裝入類並做類的靜態初始化,返回 Class 物件。

 1 public class Demo02 {
 2 public
static void main(String[] args) { 3 //Class.forName()的方式,注意這裡傳入的是全限定名 4 try { 5 Class<?> clazz = Class.forName("com.zhuhuicong.classobject.DemoClass"); 6 System.out.println(clazz); 7 } catch (ClassNotFoundException e) { 8 e.printStackTrace(); 9 } 10 } 11 } 12 13 class DemoClass{ 14 //1建構函式 15 public DemoClass() { 16 System.out.println("我是建構函式"); 17 } 18 19 //2靜態程式碼塊 20 static { 21 System.out.println("我是靜態程式碼塊"); 22 } 23 24 //3非靜態程式碼塊 25 { 26 System.out.println("我是非靜態程式碼塊"); 27 } 28 } 29 30 Result: 31 我是靜態程式碼塊 32 class com.zhuhuicong.classobject.DemoClass
View Code

3例項物件.getClass() 的形式會對類進行靜態初始化、非靜態初始化,返回引用執行時真正所指的物件(因為子物件的引用可能會賦給父物件的引用變數中)所屬的類的 Class 物件。

 1 public class Demo03 {
 2 public static void main(String[] args) {
 3 //例項物件.getclass()方式
 4 Class<? extends DemoClass> clazz = new DemoClass().getClass();
 5 System.out.println(clazz);
 6 }
 7 }
 8 
 9 class DemoClass{
10 //1建構函式
11 public DemoClass() {
12 System.out.println("我是建構函式");
13 }
14 
15 //2靜態程式碼塊
16 static {
17 System.out.println("我是靜態程式碼塊");
18 }
19 
20 //3非靜態程式碼塊
21 {
22 System.out.println("我是非靜態程式碼塊");
23 }
24 }
25 
26 Result:
27 我是靜態程式碼塊
28 我是非靜態程式碼塊
29 我是建構函式
30 class com.zhuhuicong.classobject.DemoClass
View Code