java基礎——反射基礎知識
阿新 • • 發佈:2019-02-16
動態代理在專案中應用的比較多,動態代理是依靠反射技術來實現的,今天就來系統的學習一下反射。
java中提供的反射機制是說在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。
java反射的主要實現類:
java.lang.Class:表示正在執行的java應用程式中的類和介面,提供得到Construtor、Field、Method的方法。 java.lang.reflect.Constructor:提供關於類的單個構造方法的資訊以及對它的訪問許可權。 java.lang.reflect.Field:提供關於類或介面的屬性資訊,以及對它的動態訪問許可權。 java.lang.reflect.Method:提供關於類或介面中某個方法的資訊。 下面通過程式碼來學習: //獲取Class類物件
Class class1 = Person.class;
Class class2 = Class.forName("com.ls.Person");
Person person = new Person();
Class class3 = person.getClass();
//建立物件例項
Person person = (Person)Class.forName("com.ls.Person").newInstance();
//獲取屬性 //返回此 Class 物件表示的類或介面的所有可訪問公共欄位 Field[] fields = Class.forName("com.ls.Person").getFields(); //返回 Class 物件所表示的類或介面所宣告的所有欄位。包括公共、保護、預設(包)訪問和私有欄位,但不包括繼承的欄位 Field[] fields2 = Class.forName("com.ls.Person").getDeclaredFields(); //返回 Class 物件所表示的類或介面的指定已宣告欄位 Field field3 = Class.forName("com.ls.Person").getDeclaredField("age"); //返回Class 物件所表示的類或介面的指定公共成員欄位 Field field4 = Class.forName("com.ls.Person").getField("name"); for (int i = 0; i < fields.length; i++) { System.out.println(fields[i].getName()); } for (int i = 0; i < fields2.length; i++) { System.out.println(fields2[i].getName()); } //啟用和禁用訪問安全檢查的開關。預設為false。值為 true表示反射的物件在使用時應該取消 Java 語言訪問檢查 field3.setAccessible(true); System.out.println(field3.get(person)); System.out.println(field4.get(person));
以上程式碼基於Person類://獲取方法 Method method = Class.forName("com.ls.Person").getMethod("getName", null); Method method2 = Class.forName("com.ls.Person").getMethod("setName", String.class); System.out.println(method.invoke(Class.forName("com.ls.Person").newInstance(), null)); System.out.println(method2.invoke(Class.forName("com.ls.Person").newInstance(), "柳鬆"));
class Person {
public String name = "ls";
private String age = "18";
public Person(){}
public Person(String name,String age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public String setName(String name) {
return name;
}
}
綜上,可以理解為反射就是把java類中的各種成分對映成相應的java類,即一個類以及類中的變數、方法、建構函式、包等資訊,都可以當成一個物件來處理,分別對應jdk中相應的類:Class、Field、Method、Construction、Package等。