總結(jié)內(nèi)容源自一下文章
粗淺看java反射機制
反射機制應(yīng)用實踐
談?wù)刯ava反射機制
Java Reflection(反射機制)詳解
八、獲取類的 Method
通過反射機制得到某個類的某個方法,然后調(diào)用對應(yīng)于這個類的某個實例的該方法
Class<T>類提供了幾個方法獲取類的方法肖爵。
public Method getMethod(String name, Class<?>... parameterTypes)
public Method[] getMethods()
public Method getDeclaredMethod(Stringname,Class<?> parameterTypes)
public Method[] getDeclaredMethods()
getMethod()返回一個 Method 對象杨刨,它反映此 Class 對象所表示的類或接口的指定公共成員方法惭缰;
getMethods()返回一個包含某些 Method 對象的數(shù)組,這些對象反映此Class 對象所表 示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那 些的類或接口)的公共 member 方法解取;
getDeclaredMethod()返回一個 Method 對象愈案,該對象反映此Class對象所表示的類或接口的指定已聲明方法挺尾;
getDeclaredMethods()返回 Method對象的一個數(shù)組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法站绪,包括公共遭铺、保護、默認(包)訪問和私有方法恢准,但不包括繼承的方法魂挂。
如果知道要調(diào)用方法的具體參數(shù)類型,就可以直接通過參數(shù)類型來獲取指定的方法馁筐,下面這個例子中返回方法對象名稱是“testPrivateMethod”涂召,他的方法參數(shù)是 String 類型:
try {
Method privateMethod = classType.getDeclaredMethod("testPrivateMethod", new Class[]{String.class});
System.out.println(privateMethod);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
方法參數(shù)以及返回類型
獲取指定方法的方法參數(shù)是哪些:
Method method = ... //獲取Class對象
Class[] parameterTypes = method.getParameterTypes();
獲取指定方法的返回類型:
Method method = ... //獲取Class對象
Class returnType = method.getReturnType();
通過 Method 對象調(diào)用方法
可以通過如下方式來調(diào)用一個方法:
//獲取一個方法名為doSomesthing,參數(shù)類型為String的方法
Method method = MyObject.class.getMethod("doSomething", String.class);
Object returnValue = method.invoke(null, "parameter-value1"); // 靜態(tài)方法第一個參數(shù)直接傳遞null
傳入的 null 參數(shù)是要調(diào)用方法的對象敏沉,如果是一個靜態(tài)方法調(diào)用的話則可以用 null 代替指定對象作為 invoke()的參數(shù)果正,在上面這個例子中,如果 doSomething 不是靜態(tài)方法的話盟迟,你就要傳入有效的 MyObject 實例而不是 null秋泳。 Method.invoke(Object target, Object … parameters)方法的第二個參數(shù)是一個可變參數(shù)列表,但是你必須要傳入與你要調(diào)用方法的形參一一對應(yīng)的實參攒菠。就像上個例子那樣迫皱,方法需要 String 類型的參數(shù),那我們必須要傳入一個字符串辖众。
如果方法為私有方法卓起,則需要先改變訪問權(quán)限,同時赵辕,需要捕獲異常:
try {
Method privateMethod = ... //獲取method
privateMethod.setAccessible(true);
privateMethod.invoke(null, "meth-reflection"); // 第二個參數(shù)為函數(shù)需要的參數(shù)列表既绩,類型為 Object... args
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
九、父類
通過 Class 對象你可以訪問類的父類还惠,如下例:
Class superclass = aClass.getSuperclass();
可以看到 superclass 對象其實就是一個 Class 類的實例饲握,所以可以繼續(xù)在這個對象上進行反射操作。
十蚕键、實現(xiàn)的接口
可以通過如下方式獲取指定類所實現(xiàn)的接口集合:
Class aClass = ... //獲取Class對象救欧,具體方式可見Class對象小節(jié)
Class[] interfaces = aClass.getInterfaces();
由于一個類可以實現(xiàn)多個接口,因此 getInterfaces(); 方法返回一個 Class 數(shù)組锣光,在 Java 中接口同樣有對應(yīng)的 Class 對象笆怠。 注意:getInterfaces() 方法僅僅只返回當(dāng)前類所實現(xiàn)的接口。當(dāng)前類的父類如果實現(xiàn)了接口誊爹,這些接口是不會在返回的 Class 集合中的蹬刷,盡管實際上當(dāng)前類其實已經(jīng)實現(xiàn)了父類接口瓢捉。
Class<?> hashMapClass = HashMap.class;
Class<?> [] interfaces = hashMapClass.getInterfaces();
for (Class<?> interf : interfaces) {
System.out.println(interf);
}
System.out.println();
Class<?> superClass = hashMapClass.getSuperclass();
System.out.println(superClass);
十一、構(gòu)造器
我們可以通過 Class 對象來獲取 Constructor 類的實例:
Class aClass = ...//獲取Class對象
Constructor[] constructors = aClass.getConstructors();
返回的 Constructor 數(shù)組包含每一個聲明為公有的(Public)構(gòu)造方法办成。 如果知道要訪問的構(gòu)造方法的方法參數(shù)類型泡态,你可以用下面的方法獲取指定的構(gòu)造方法,這例子返回的構(gòu)造方法的方法參數(shù)為 String 類型:
Class aClass = ...//獲取Class對象
Constructor constructor = aClass.getConstructor(new Class[]{String.class});
如果沒有指定的構(gòu)造方法能滿足匹配的方法參數(shù)則會拋出:NoSuchMethodException迂卢。
構(gòu)造方法參數(shù)
通過如下方式獲取指定構(gòu)造方法的方法參數(shù)信息:
Constructor constructor = ... //獲取Constructor對象
Class[] parameterTypes = constructor.getParameterTypes();
利用 Constructor 對象實例化一個類
可以通過如下方法實例化一個類:
Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");
constructor.newInstance()方法的方法參數(shù)是一個可變參數(shù)列表某弦,但是當(dāng)調(diào)用構(gòu)造方法的時候必須提供精確的參數(shù),即形參與實參必須一一對應(yīng)而克。在這個例子中構(gòu)造方法需要一個 String 類型的參數(shù)靶壮,那我們在調(diào)用 newInstance 方法的時候就必須傳入一個 String 類型的參數(shù)。
調(diào)用類的 Class對象的 newInstance方法员萍,該方法會調(diào)用對象的默認構(gòu)造器腾降,如果沒有默認構(gòu)造器,會調(diào)用失敗.
aClass.newInstance(); //直接調(diào)用類的newInstance()