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