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));
}
}