2016年1月5日 星期二

java的反射機制 Reflection API

Reflection簡單的說,當你在寫code的時候,
有時你並不知道要實體化哪一個class,
而是在執行階段才決定實體化哪個class,
這時候就可以使用Reflection API。

使用反射實體化class

方法一:
取得class,然後實體化它。
這時使用的是預設建構式。

Class<?> clazz=Class.forName(className);
Fo fo=(Fo)clazz.newInstance();

方法二:
如果class 沒有default constructor
或是有數個constructor,
而你想指定使用其中一個。

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

Class<?> clazz=Class.forName(className);
//使用參數型態為String的constructor
Constructor<?> constructor=clazz.getConstructor(String.class);
//實體化
Object obj=constructor.newInstance("hi");


操作class的Method
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;

//取得class
Class clazz=Class.forName("someClass");

//取得method,並且指定參數類型
Method method=clazz.getMethod("methodName",String.class,int.class);

//取方法的修飾詞
int modifier=method.getModifier();

//取方法返回值
Type type=method.getGenericReturnType();

//取方法參數類型
Class[] klasses=method.getparameterTypes();

//取得method
Method med=clazz.getMethod("getInstance",int.class);

//呼叫static method,得到回傳值
Object resObj=med.invoke(null);

//取得method
Method noStaticMethod=clazz.getMethod("noStaticMethod",int.class);

//呼叫method,傳入呼叫這個方法的物件及參數,得到回傳值
Object resObj=noStaticMethod.invoke(clazz.newInstance(),3);

沒有留言:

張貼留言