1. 程式人生 > 遊戲攻略 >《原神攻略》稻妻四個華麗寶箱獲取攻略

《原神攻略》稻妻四個華麗寶箱獲取攻略

1、反射機制

1.1、反射機制有什麼用?
通過java語言中的反射機制可以操作位元組碼檔案。
優點可以讀和修改位元組碼檔案。
通過反射機制可以操作程式碼片段。(class檔案。)

1.2、反射機制的相關類在哪個包下?
java.lang.reflect.*;

1.3、反射機制相關的重要的類有哪些?

java.lang.Class:代表整個位元組碼,代表一個型別,代表整個類。

java.lang.reflect.Method:代表位元組碼中的方法位元組碼。代表類中的方法。

java.lang.reflect.Constructor:代表位元組碼中的構造方法位元組碼。代表類中的構造方法

java.lang.reflect.Field:代表位元組碼中的屬性位元組碼。代表類中的成員變數(靜態變數+例項變數)。

java.lang.Class:

public class User{

// Field

int no;

// Constructor

public User(){

}

public User(int no){

this.no = no;

}

// Method

public void setNo(int no){

this.no = no;

}

public int getNo(){

return no;

}

}

2、獲取到Class,能幹什麼?

 1 package com.bjpowernode.java.reflect;
 2 
 3 import com.bjpowernode.java.bean.User;
 4 
 5 /*
 6 獲取到Class,能幹什麼?
 7     通過Class的newInstance()方法來例項化物件。
 8     注意:newInstance()方法內部實際上呼叫了無引數構造方法,必須保證無參構造存在才可以。
 9  */
10 public class ReflectTest02 {
11     public
static void main(String[] args) { 12 13 // 這是不使用反射機制,建立物件 14 User user = new User(); 15 System.out.println(user); 16 17 // 下面這段程式碼是以反射機制的方式建立物件。 18 try { 19 // 通過反射機制,獲取Class,通過Class來例項化物件 20 Class c = Class.forName("com.bjpowernode.java.bean.User"); // c代表User型別。 21 22 // newInstance() 這個方法會呼叫User這個類的無引數構造方法,完成物件的建立。 23 // 重點是:newInstance()呼叫的是無參構造,必須保證無參構造是存在的! 24 Object obj = c.newInstance(); 25 26 System.out.println(obj); // com.bjpowernode.java.bean.User@10f87f48 27 } catch (ClassNotFoundException e) { 28 e.printStackTrace(); 29 } catch (IllegalAccessException e) { 30 e.printStackTrace(); 31 } catch (InstantiationException e) { 32 e.printStackTrace(); 33 } 34 } 35 }

3、驗證反射機制的靈活性

 1 package com.bjpowernode.java.reflect;
 2 
 3 import com.bjpowernode.java.bean.User;
 4 
 5 import java.io.FileReader;
 6 import java.util.Properties;
 7 
 8 /*
 9 驗證反射機制的靈活性。
10     java程式碼寫一遍,再不改變java原始碼的基礎之上,可以做到不同物件的例項化。
11     非常之靈活。(符合OCP開閉原則:對擴充套件開放,對修改關閉。)
12 
13 後期你們要學習的是高階框架,而工作過程中,也都是使用高階框架,
14 包括: ssh ssm
15     Spring SpringMVC MyBatis
16     Spring Struts Hibernate
17     ...
18     這些高階框架底層實現原理:都採用了反射機制。所以反射機制還是重要的。
19     學會了反射機制有利於你理解剖析框架底層的原始碼。
20  */
21 public class ReflectTest03 {
22     public static void main(String[] args) throws Exception{
23 
24         // 這種方式程式碼就寫死了。只能建立一個User型別的物件
25         //User user = new User();
26 
27         // 以下程式碼是靈活的,程式碼不需要改動,可以修改配置檔案,配置檔案修改之後,可以創建出不同的例項物件。
28         // 通過IO流讀取classinfo.properties檔案
29         FileReader reader = new FileReader("chapter25/classinfo2.properties");
30         // 建立屬性類物件Map
31         Properties pro = new Properties(); // key value都是String
32         // 載入
33         pro.load(reader);
34         // 關閉流
35         reader.close();
36 
37         // 通過key獲取value
38         String className = pro.getProperty("className");
39         //System.out.println(className);
40 
41         // 通過反射機制例項化物件
42         Class c = Class.forName(className);
43         Object obj = c.newInstance();
44         System.out.println(obj);
45     }
46 }

4.Class.forName()發生了什麼?

 1 package com.bjpowernode.java.reflect;
 2 /*
 3 研究一下:Class.forName()發生了什麼?
 4     記住,重點:
 5         如果你只是希望一個類的靜態程式碼塊執行,其它程式碼一律不執行,
 6         你可以使用:
 7             Class.forName("完整類名");
 8         這個方法的執行會導致類載入,類載入時,靜態程式碼塊執行。
 9 
10 提示:
11     後面JDBC技術的時候我們還需要。
12  */
13 public class ReflectTest04 {
14     public static void main(String[] args) {
15         try {
16             // Class.forName()這個方法的執行會導致:類載入。
17             Class.forName("com.bjpowernode.java.reflect.MyClass");
18         } catch (ClassNotFoundException e) {
19             e.printStackTrace();
20         }
21     }
22 }