前面我們學習了通過類類型來獲取類中相應方法,那麼我們可以通過java反射機制對類中的方法進行調用等基本操作嗎?
我們調用類中函數時,都是通過類的實例進行調用,接下來我們來通過一段代碼測試一下如何利用java反射進行類中方法的調用
class A{
public void print() {
System.out.println("我有你");
}
public void print(int a,int b) {
System.out.println(a+b);
}
public void print(String a,String b) {
System.out.println(a.toUpperCase()+","+b.toLowerCase());
}
}
要想唯一確定一個函數,通過函數名加參數列表即可以確定。在類A中有三個的函數,分別爲無參的函數和兩個有參函數,則我們通過java方法反射來進行函數的調用:
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//要獲取print(int,int)方法,首先要獲得類的信息,獲取類的信息首先要獲得類的類類型
A a=new A();
Class c=a.getClass();//獲取類的類類型
/*
* 獲取方法名稱和參數列表,得到方法
* getMethod()獲取的是public的方法
* getDeclaredMethod()方法獲取的是自己聲明的方法
*/
Method m=c.getMethod("print", new Class[] {int.class,int.class});//利用數組來表示參數列表
//方法的反射操作,用m對象來進行方法的調用
Object o=m.invoke(a,new Object[] {1,2});//數組傳參
Method m2=c.getMethod("print", new Class[] {String.class,String.class});
Object o2=m2.invoke(a, "hello","world");//直接傳參
System.out.println(o2); //函數爲void類型,則返回的對象爲空
Method m3=c.getMethod("print");//調用的函數無參,則可以直接不寫參數,或者寫一個沒有元素的數組new Class[]{}
Object o4=m3.invoke(a);
}