webpack基礎配置
阿新 • • 發佈:2020-09-02
java反射
獲取Class物件的方式
- Class.forName("全類名"): 將位元組碼檔案載入進記憶體,返回class物件
- 多用於配置檔案,將類名定義在配置檔案中,讀取檔案載入類
- 類名.class:通過類名的class屬性來獲取
- 多用於引數的傳遞
- 物件.getClass(): 通過物件的getClass方法來獲取
-
多用於物件的獲取位元組碼方式
package reflect;
public class Reflect {
// 獲取class的三種方式 public static void main(String[] args) throws ClassNotFoundException { //1.Class.forName("全類名"): 將位元組碼檔案載入進記憶體,返回class物件 Class cls1 = Class.forName("reflect.Person"); System.out.println(cls1); //2類名.class:通過類名的class屬性來獲取 Class cls2 = Person.class; System.out.println(cls2); //3.物件.getClass(): 通過物件的getClass方法來獲取 Person person = new Person(); Class cls3 = person.getClass(); System.out.println(cls3); // 比較三個物件 System.out.println(cls1 == cls2); //true System.out.println(cls1 == cls3); //true }
}
-
同一個位元組碼檔案(*.class)在程式執行過程中,只會被載入一次,不論通過哪一種方式獲取的class物件都是同一個
使用class物件
- 獲取功能
- 獲取成員變數
- Field[] getFields()
- 獲取所有public修飾的成員變數
- Field getField(String name)
- Field[] getDeclaredFields()
- Field getDeclaredField(String name)
- Field[] getFields()
- 獲取構造方法們
- Constructor<?>[] getConstructors()
- Constructor
getConstructor(類<?>... parameterTypes) - Constructor<?>[] getDeclaredConstructors()
- Constructor
getDeclaredConstructor(類<?>... parameterTypes)
- 獲取成員方法們
- Method[] getMethods()
- Method getMethod(String name, 類<?>... parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name, 類<?>... parameterTypes)
- 獲取類其他屬性
- 獲取類名
- String Name getName()
- 獲取類名
- Field: 成員變數
- 操作:
- 設定值:
- void set(Object obj, Object value);
- 設定值:
- get(Object obj)
- 暴力反射
- setAccessible(true)
- 設定值:
- 操作:
- Constructor:
- 建立物件:
- newInstance: 建立物件
- 建立物件:
- Method
- 執行方法:
- invoke(Object obj, Object... args)
- 獲取方法的名稱
- getName
- 執行方法:
- 獲取成員變數
-
package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Reflect { // 獲取class的三種方式 public static void main(String[] args) throws Exception { Class<?> cls1 = Class.forName("reflect.Person"); // - 獲取成員變數 // - Field[] getFields() Field[] fields = cls1.getFields(); for (Field field : fields) { System.out.println(field); } Field sex = cls1.getField("sex"); Person person = new Person(); // 獲取值 Object value = sex.get(person); System.out.println(value); // 設定值 sex.set(person, "男"); System.out.println(person.sex); // 獲取所有的成員變數,不考慮成員修飾符 Field[] declaredFields = cls1.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } Field name = cls1.getDeclaredField("name"); // 忽略訪問許可權修飾符的安全檢查--> 暴力反射 name.setAccessible(true); Object o = name.get(person); System.out.println(o); // 獲取構造方法 Constructor<?> constructor = cls1.getConstructor(String.class, int.class); System.out.println(constructor); // 建立物件 Object ivy = constructor.newInstance("IVY", 23); System.out.println(ivy); // 獲取成員方法們 Method[] methods = cls1.getMethods(); for (Method method : methods) { System.out.println(method); } // 獲取指定的方法 // 空參方法獲取 Method eat = cls1.getMethod("eat"); eat.invoke(person); // 有參方法獲取 Method say = cls1.getMethod("say", String.class); say.invoke(person, "123"); // 獲取類名 String name1 = cls1.getName(); System.out.println(name1); } }