上一篇介紹基本反射建立物件(無參建構子)。本文進階示範帶參數建構子與帶參數方法的反射呼叫,並分析反射的優缺點。
// 1. 取得 Class 物件
Class> cla = Class.forName("java.lang.StringBuffer");
// 2. 定義參數型別陣列
Class>[] paraTypes = new Class>[]{String.class};
// 3. 取得對應建構子
Constructor> constructor = cla.getConstructor(paraTypes);
// 4. 準備實際參數值
Object[] paraValues = new Object[]{"example"};
// 5. 實例化物件
Object obj = constructor.newInstance(paraValues); // 等同 new StringBuffer("example")
若為無參建構子,paraTypes 與 paraValues 傳 null 或長度 0 陣列即可。
Class>[] methodParaTypes = new Class>[]{int.class, char.class};
Method method = cla.getMethod("insert", methodParaTypes);
Object[] methodArgs = new Object[]{4, 'u'};
method.invoke(obj, methodArgs);
br.insert(4,'u') 需四行反射代碼。NoSuchMethodException、IllegalArgumentException 等,增加異常處理負擔。「一般應用不應在運行時以反射方式訪問物件,僅在極受限情況下使用。」