ELK-Elasticsearch、Logstash、Kibana流程原理及搭建
阿新 • • 發佈:2021-07-30
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 publicstatic 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 }