1. 程式人生 > >隨筆12 java反射機制

隨筆12 java反射機制

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反射機制