Docker部署Hadoop+Hive
阿新 • • 發佈:2021-11-03
Java反射
1. 定義
Java放射機制是在執行狀態中,對於任意一個類,都能知道這個類的所有屬性和方法;對於任意一個物件,都能呼叫它的任意方法和屬性。
2. 反射機制的相關類
與Java反射相關的類如下:
類名 | 用途 |
---|---|
Class類 | 代表類的實體,在執行的Java應用程式中表示類和介面 |
Field類 | 代表類的成員變數(成員變數也稱為類的屬性) |
Method類 | 代表類的方法 |
Constructor類 | 代表類的構造方法 |
2.1 Class類
Class代表類的例項,在執行的Java應用程式中表示類和介面。在這個類中提供了很多有用的方法:
- 獲得類相關的方法
方法 | 用途 |
---|---|
asSubclass(Class clazz) | 把傳遞的類的物件轉換成代表子類的物件 |
Cast | 把物件轉換成代表類或是介面的物件 |
getClassLoader() | 獲得類的載入器 |
getClasses() | 返回一個數組,陣列中包含該類中所有公共類和介面類的物件 |
GetDeclaredClasses() | 返回一個數組,陣列中包含該類中所有類和介面類的物件 |
forName(String className) | 根據類名返回類的物件 |
getName() | 獲得類的完整路勁名字 |
newInstance() | 建立類的例項 |
getPackage() | 獲得類的包 |
getSimpleName() | 獲得類的名字 |
getSuperclass() | 獲得當前類繼承的父類的名字 |
getInterfaces() | 獲得當前類實現的類或是介面 |
- 獲得類中屬性相關的方法
方法 | 用途 |
---|---|
getField(String name) | 獲得某個公有的屬性物件 |
getFields() | 獲得所有公有的屬性物件 |
getDeclaredField(String name) | 獲得某個屬性物件 |
getDeclaredField() | 獲得所有屬性物件 |
- 獲得類中註解相關的方法
- 獲得類中構造器相關的方法
方法 | 用途 |
---|---|
getConstructor(Class...<?> parameterTypes) | 獲得該類中與引數型別匹配的公有構造方法 |
getConstructors() | 獲得該類的所有公有構造方法 |
getDeclaredConstructor(Class...<?> parameterTypes) | 獲得該類中與引數型別匹配的構造方法 |
getDeclaredConstructors() | 獲得該類所有構造方法 |
- 獲得類中方法相關的方法
方法 | 用途 |
---|---|
getMethod(String name, Class...<?> parameterTypes) | 獲得該類某個公有的方法 |
getMethods() | 獲得該類所有公有的方法 |
getDeclaredMethod(String name, Class...<?> parameterTypes) | 獲得該類某個方法 |
getDeclaredMethods() | 獲得該類所有方法 |
- 類中其他重要的方法
2.2 Field類
Field代表類的成員變數(成員變數也稱為類的屬性)
方法 | 用途 |
---|---|
equals(Object obj) | 屬性與obj相等則返回true |
get(Object obj) | 獲得obj中對應的屬性值 |
set(Object obj, Object value) | 設定obj中對應屬性值 |
2.3 Method類
method代表類的方法
方法 | 用途 |
---|---|
invoke(Object obj, Object... args) | 傳遞object物件及引數呼叫該方法對應的方法 |
2.4 Constructor類
Constructor代表類的構造方法
方法 | 用途 |
---|---|
newInstance(Object... initargs) | 根據代替的引數建立類的物件 |
2.4 四個類的關係
- 位元組碼中有多個欄位、方法、構造器,是用陣列儲存的。
- 數組裡的每一個元素,都是對應的物件。
- Field、Method、Constructor物件內部有對欄位、方法、構造器更詳細的描述。
3. 反射的使用
3.1 建立Class物件
- 建立Class物件的方式一:(物件.getClass()),獲取類中的位元組碼檔案。
Class clazz = p1.getClass()
- 建立Class物件的方式二:(類.class),需要輸入一個明確的類,任意一個類都有一個靜態的class屬性。
Class clazz = Person.class;
- 建立Class物件的方式三:(forName("String className"))。
Clazz = Class.forName("Person");
3.2 根據反射建立物件例項
- 通過類物件的newInstance方法。
Object o1 = p1.newInstance();
- 通過構造器的newInstance方法。
3.3 根據反射呼叫方法
invoke(Object obj, Object... args)