有時你並不知道要實體化哪一個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);
沒有留言:
張貼留言