反射知識1-訪問構造方法

今天在家,突然想到了老師講課沒有講到過反射機制,這是JDK1.5加入的新功能,通過反射,可以在程序中訪問已經裝載到JVM裏的java對象描述,實現訪問、檢測和修改java對象本身信息的功能.
先列出來我下面寫的這個小例子用到的方法
getClass():返回此 類 的運行時類
getDeclaredConstructors():獲得構造方法,返回Constructor[]
isVarArgs():構造方法是否含有可變數量的參數
getParameterTypes():構造方法的入口參數類型,返回Class[]
getExceptionTypes():可能拋出的異常,返回Class[]
newInstance():表示的構造方法來創建該構造方法的聲明類的新實例,我覺得這個可以想成構造方法的代替。

Example_01 Code:

public class Example_01 {
String s;
int i, i2, i3;

private Example_01() {
}

protected Example_01(String s, int i) {
this.s = s;
this.i = i;
}

public Example_01(String...strings) {
if(0 < strings.length) {
i = Integer.valueOf(strings[0]);
}
if(1 < strings.length) {
i2 = Integer.valueOf(strings[1]);
}
if(2 < strings.length) {
i3 = Integer.valueOf(strings[2]);
}
}

public void print() {
System.out.println("s = " + s);
System.out.println("i = " + i);
System.out.println("i2 = " + i2);
System.out.println("i3 = " + i3);
}
}


Main_01 Code:

import java.lang.reflect.Constructor;

/**
* 測試類,通過反射訪問Example_01類中的所有構造方法,並將該構造方法
* 是否允許帶有可變數量的參數、入口參數類型和可能拋出的異常類型輸出
* @author Xue
*
*/
public class Main_01 {
public static void main(String[] args) {
Example_01 example = new Example_01("10", "20", "30");
Class exampleC = example.getClass();//返回此 類 的運行時類
//獲得所有構造方法
Constructor[] declaredConstructors = exampleC.getDeclaredConstructors();
for(int i = 0; i <declaredConstructors.length; i++) {
//遍歷構造方法
Constructor constructor = declaredConstructors[i];
System.out.println("查看是否允許帶有可變數量的參數:" + constructor.isVarArgs());
System.out.println("該構造方法的入口參數依次是:");
//獲取所有參數類型
Class[] parameterTypes = constructor.getParameterTypes();
for(int j = 0; j < parameterTypes.length; j++) {
System.out.println("" + parameterTypes[j]);
}
System.out.println("該構造方法可能拋出的異常類型爲:");
//獲取所有可能拋出的異常
Class[] exceptionTypes = constructor.getExceptionTypes();
for(int j = 0; j < exceptionTypes.length; j++) {
System.out.println("" + exceptionTypes[j]);
}
Example_01 example2 = null;
while(example2 == null) {
//如果訪問權限是private,則拋出異常,既不允許訪問
try {
if(i == 0) {//通過執行默認沒有參數的構造方法創建對象
example2 = (Example_01) constructor.newInstance();
} else if(i ==1) {//通過執行有兩個參數的構造方法創建對象
example2 = (Example_01) constructor.newInstance("7" ,5);
} else {//通過執行可變參數的構造方法來創建對象
Object[] parameter = new Object[]{new String[]{"100", "200", "300"}};
example2 = (Example_01) constructor.newInstance(parameter);
}
} catch (Exception e) {
System.out.println("在創建對象的時候拋出異常,下面執行setAccessibl()方法");
constructor.setAccessible(true); //更改爲可訪問
}
}
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章