天天看點

java之反射java之反射

java之反射

1. Class對象擷取方法

   1.1 通過Class.forName(“類全限定名”),類的全限定名:類名+包名

   1.2 通過Class的屬性來擷取,className.class

   1.3 調用某個對象的getClass()方法

   1.4 第一種比第二種的性能更好,不需要調用方法,且更安全,因為在編譯期間檢查類是否存在,如果是字元串來獲得,隻能用第一種。

2. 從Class對象中獲得有關資訊

   2.1 ConstructorgetConstructor(Class

   2.2 Constructors

   2.3 Method getMethod(String methodName,Class…paramType) 傳回該class對應的,帶指定形參的方法

   2.4 Method[] getMethods() 傳回所有的public方法

   2.5 Filed getFiled(String name) 傳回該類所對應的名為name的成員變量

   2.6 Filed[] getFileds() 傳回public的所有成員變量

   2.7 反射可以調用私有的構造函數和方法的,隻是這裡沒有列舉

3. 使用反射生成對象

     3.1 使用Class的newInstance(),要求是必須有預設構造函數

public Test{
    public static void main(String[]args){
        Class<Test>cls=Test.class;
        cls.newInstance();
    }
}
           

     3.2先用Class對象獲得Constructor對象,再用constructor對象使用newInstance建立對象

public Test{
    private String name;
    public Test(String name){
        this.name=name;
    }
    public static void main(String[]args){
        Class<Test>cls=Test.class;
        Constructor ctor=cls.getConstructor(String,class);
    }
}
           

對于上面兩種建立方法,一般采用第一種,因為在javaEE裡面,都是用配置檔案來建立對象,配置檔案大多都是類的全限定名。

4. 動态建立數組

使用Array類,通過 Object Array.newInstance(Class<?>componentType,int length)來進行執行個體化,同時通過set(Object array,int index,int value)來設定值,通過get(Object,int index)來擷取值。案例代碼如下:

package javase;
 import java.lang.reflect.Array;
 public class Demo {
 public static void main(String[] args) throws  ClassNotFoundException {
        Object obj=Array.newInstance(Integer.class, 2);
        Array.set(obj, 0,1);
        System.out.println(Array.get(obj, 0));
     }
 }