隨筆12 java反射機制
阿新 • • 發佈:2017-11-11
ron fields () exception 修飾符 等等 img get nbsp
一:反射機制
Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為Java語言的反射機制。
二:反射機制的作用
1 反編譯:.class-->.java
2 通過反射機制訪問java對象的屬性,方法,構造方法等;
三:sun為我們提供了那些反射機制中的類:
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
四:具體實現
1 反射機制獲取類有三種方法,我們來獲取Employee類型
1 //第一種方式: 2 Class c1 = Class.forName("Employee"); 3 //第二種方式: 4 //java中每個類型都有class 屬性. 5 Classc2 = Employee.class; 6 //第三種方式: 7 //java語言中任何一個java對象都有getClass 方法 8 Employee e = new Employee(); 9 Classc3 = e.getClass(); //c3是運行時類 (e的運行時類是Employee)
2 創建對象:獲取類以後我們來創建它的對象,利用newInstance:
1 Class c =Class.forName("Employee"); 2 //創建此Class 對象所表示的類的一個新實例 3 Objecto = c.newInstance(); //調用了Employee的無參數構造方法.
3 獲取屬性:分為所有的屬性和指定的屬性:
a,先看獲取所有的屬性的寫法:
//獲取整個類 Class c = Class.forName("java.lang.Integer");//獲取所有的屬性 Field[] fs = c.getDeclaredFields(); //定義可變長的字符串,用來存儲屬性 StringBuffer sb = new StringBuffer(); //通過追加的方法,將每個屬性拼接到此字符串中 //最外邊的public定義 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");//獲取修飾符public class //裏邊的每一個屬性 for(Field field:fs){ sb.append("\t");//空格
sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字 sb.append(field.getName()+";\n");//屬性的名字+回車 } sb.append("}"); System.out.println(sb);
b,獲取特定的屬性:
1 public static void main(String[] args) throws Exception{ 2 <span style="white-space:pre"> </span>//以前的方式: 3 /* 4 User u = new User(); 5 u.age = 12; //set 6 System.out.println(u.age); //get 7 */ 8 //獲取類 9 Class c = Class.forName("User"); 10 //獲取id屬性 11 Field idF = c.getDeclaredField("id"); 12 //實例化這個類賦給o 13 Object o = c.newInstance(); 14 //打破封裝 15 idF.setAccessible(true); //使用反射機制可以打破封裝性,導致了java對象的屬性不安全。 16 //給o對象的id屬性賦值"110" 17 idF.set(o, "110"); //set 18 //get 19 System.out.println(idF.get(o)); 20 }
4,獲取方法,和構造方法,不再詳細描述,只來看一下關鍵字:
隨筆12 java反射機制