1. 程式人生 > >Java反射(一眼就看會)

Java反射(一眼就看會)

exceptio 構造方法 ble -- div 反射機制 exception .get except

JAVA反射機制:

(1)在運行狀態中
(2)對於任意一個類,都能夠知道這個類的所有屬性和方法;
(3)對於任意一個對象(類的一個實例),都能夠調用(訪問,檢測和修改)它的任意一個方法和屬性;

這種動態獲取的信息以及動態調用對象的方法的功能稱為Java語言的反射機制。

反射機制的作用:

1.  反編譯:.class-->.java

2.  通過反射機制訪問java對象的屬性,方法,構造方法等;


實例:

一、反射機制獲取類有三種方法
package First;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test { private int a; private String id; public static void main(String[] args) throws Exception { //1 Class c = Class.forName("First.Test"); System.out.println(c); //2 Class c2 = Test.class; System.out.println(c2);
//3 Test c3 = new Test(); Class c4 = c3.getClass(); System.out.println(c4); } }

 輸出如下:
class First.Test
class First.Test
class First.Test

  

二、創建對象:
Class c = Class.forName("First.Test");  
/*
 * 創建此Class 對象所表示的類的一個新實例
 * 調用了Employee的無參數構造方法. 
 */
Object o = c.newInstance();


三、獲取屬性
(1)獲取指定屬性
package First;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test {
    
    private String id;
    
    public static void main(String[] args) throws Exception {
        
        //獲取類  包名.類名
        Class c = Class.forName("First.Test");  

        //獲取Test類的id屬性
        Field fs = c.getDeclaredField("id");  
        
        //實例化這個類賦給o 
        Object o = c.newInstance(); 
        
        //打破封裝,使能修改
        fs.setAccessible(true);
        
        //運行狀態時,給o對象的id屬性賦值"110" 
        fs.set(o, "110"); //set 
        
        System.out.println(fs.get(o)); 
    }
}


輸出如下:
110

  

(2)獲取所有屬性

package First;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test {
    
    public static void main(String[] args) throws Exception {
        //獲取Integer類
        Class c = Class.forName("java.lang.Integer");  
        
        //獲取所有的屬性  
        Field[] fs = c.getDeclaredFields();  
 
        //定義可變長的字符串,用來存儲屬性  
        StringBuffer sb = new StringBuffer();  
        
        //通過追加的方法,將每個屬性拼接到此字符串中  
        sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
        
        //遍歷裏邊的每一個屬性  
        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); 
    }
}


輸出如下:
public final class Integer{
	public static final int MIN_VALUE;
	public static final int MAX_VALUE;
	public static final Class TYPE;
	static final char[] digits;
	static final char[] DigitTens;
	static final char[] DigitOnes;
	static final int[] sizeTable;
	private final int value;
	public static final int SIZE;
	public static final int BYTES;
	private static final long serialVersionUID;
}

  







參考:
http://blog.csdn.net/liujiahan629629/article/details/18013523


Java反射(一眼就看會)