移動端的網(wǎng)站怎么做的網(wǎng)絡(luò)推廣怎么賺錢
文章目錄
- 前言
- 一、訪問成員方法的方法
- 二、Method類
- 1.常用方法
- 2.實操展示
- 總結(jié)
前言
? ? ? ? 為了實現(xiàn)在某類中隨時可以調(diào)用其他類的方法,java.lang.reflect包中提供了Method方法類來實現(xiàn)該效果。每一個Method對象代表著一個方法,利用Methoc對象可以操縱相應(yīng)的方法。
一、訪問成員方法的方法
? ? ? ? Method類型的對象是指以成員方法為對象的變量。在我們獲取成員方法時,根據(jù)需要指定Method類型對象是否為數(shù)組。
方法 | 功能描述 |
getMethods() | 獲得該類的所有公有的成員方法(返回值類型為數(shù)組) |
getMethod(String name,Class<?>...parameterTypes) | 獲取指定的該類中的公開的成員方法(指定的方法由name字符串決定) |
getDeclaredMethods() | 獲取該類的所有成員方法(返回值類型為數(shù)組) |
getDeclaredMethod(String name,Class<?>...parameterTypes) | 獲取指定的該類中的成員方法(指定的方法由name字符串決定) |
? ? ? ? 實操展示:
? ? ? ? 原調(diào)用方法的類?:
public class Demo {public int add(int a,int b){System.out.println(a+"+"+b+"="+(a+b));return a+b;}private int minus(int a,int b){System.out.println(a+"-"+b+"="+(a-b));return a-b;}
}
? ? ? ? 調(diào)用該方法的類:
import java.lang.reflect.*;
public class See{Demo demo = new Demo();Class class1=demo.getClass();Method method[] =class1.getDeclaredMethods();//獲取demo類中所有的方法,返回形式為method類數(shù)組
}
? ? ? ? ?以上就是使用獲取成員方法的方法,獲取某類的成員方法的步驟了。先實例化該目標(biāo)類,然后再獲取該類的Class對象,最后使用上述表格中的方法即可。目的是在運行過程中,動態(tài)地獲取和調(diào)整類的方法參數(shù)。
二、Method類
1.常用方法
方法 | 功能描述 |
getName() | 獲得該方法的名稱 |
getParameterTypes() | 按照聲明順序以Class數(shù)組的形式獲取該方法的各個參數(shù)的類型 |
getReturnType() | 以Class對象的形式獲得該方法的返回值的類型 |
getExceptionTypes() | 以Class數(shù)組的形式獲取該方法可能拋出的異常 |
invoke(Object obj,Object...args) | 利用指定參數(shù)args執(zhí)行指定對象obj中的該方法,返回值為Object型 |
isVarArgs() | 查看該構(gòu)造方法是否允許帶有可變數(shù)量的參數(shù),如果允許返回true,否則返回false |
getModifiers() | 獲得可以解析出該方法所采用修飾符的整數(shù) |
setAccessible() | 用于設(shè)置反射對象的可訪問性,若方法的權(quán)限修飾詞為private私有,可設(shè)置為true來修改該權(quán)限,然后可以獲取該方法。 |
2.實操展示
? ? ? ? 實例:創(chuàng)建一個Demo類,在該類中創(chuàng)建多個不同的方法;創(chuàng)建See類,通過使用上述的方法獲取到該類的所有方法的所有信息;創(chuàng)建Use類,通過使用上述方法和invoke()方法來調(diào)用,調(diào)參方法并且進行使用。
? ? ? ? Demo類:
public class Demo {//add()方法public int add(int a,int b){System.out.println(a+"+"+b+"="+(a+b));return a+b;}//minus方法private int minus(int a,int b){System.out.println(a+"-"+b+"="+(a-b));return a-b;}//insert方法public String insert(String str1,String str2){char char1[] = str1.toCharArray();char char2[] = str2.toCharArray();StringBuilder end = new StringBuilder();for(int i=0;i<=(char1.length+char2.length);i++){if (i<char1.length) {end.append(char1[i]);}if(i<char2.length){end.append(char2[i]);}}System.out.println(str1+"和"+str2+"插空排序的結(jié)果為:"+end);return end.toString();}//nul方法public void nul(String...strings){StringBuilder result = new StringBuilder();for(int i=0;i<strings.length;i++){result.append(strings[i]); }String string =result.toString();System.out.println("連接的字符串為:"+string);}//綜上四個方法
}
? ? ? ? See類:
import java.lang.reflect.*;
public class See{public static void main(String[] args) {Demo demo = new Demo();Class class1=demo.getClass();Method method[] =class1.getDeclaredMethods();try{ for(int i=0;i<method.length;i++){//成員方法的名稱System.out.println("該成員方法的名稱:"+method[i].getName());//成員方法的引用參數(shù)System.out.println("該成員方法的引用參數(shù)為:");Class parameterTypes[] = method[i].getParameterTypes();for(Class c:parameterTypes){System.out.println(c);}//成員方法的返回類型System.out.println("成員方法的返回變量類型:"+method[i].getReturnType());//成員方法的權(quán)限修飾符System.out.println("成員變量的修飾符權(quán)限:"+Modifier.toString(method[i].getModifiers()));//成員方法可能報錯的異常System.out.println("成員方法可能報錯的異常:");Class class2[] = method[i].getExceptionTypes();for(Class c1:class2){System.out.println(c1);}//查看該構(gòu)造方法是否允許帶有可變數(shù)量的參數(shù)boolean b=method[i].isVarArgs();System.out.println("查看該構(gòu)造方法是否允許帶有可變數(shù)量的參數(shù):"+b);System.out.println("------------------------------");}} catch (Exception e) {e.printStackTrace();}}
}
? ? ? ? 運行結(jié)果:??
? ? ? ? 如圖所示,See類中使用了上述表格中的方法,顯示了Demo類中有關(guān)各個方法的相關(guān)信息,方法名稱、引用參數(shù)、返回變量、權(quán)限修飾符、異常報錯等等。?
? ? ? ? Use類:
import java.lang.reflect.*;
public class Use {public static void main(String[] args) {Demo demo = new Demo();Class class1 = demo.getClass();Method method[] = class1.getDeclaredMethods();for(int i=0;i<method.length;i++){try {if(method[i].getName().equals("add")){System.out.println("調(diào)用了Demo類的add()方法");method[i].invoke(demo, 100,150);}else if(method[i].getName().equals("minus")){System.out.println("調(diào)用了Demo類的minus()方法");method[i].invoke(demo, 100,350);}else if(method[i].getName().equals("insert")) {System.out.println("調(diào)用了Demo類的insert()方法");method[i].invoke(demo, "aceg","BDFH");}else if(method[i].getName().equals("nul")){System.out.println("調(diào)用了Demo類的nul()方法");method[i].invoke(demo, new Object[]{new String[]{"你好", ",", "世界", "!"}});}System.out.println("-------------------------------------");} catch (Exception e) {System.out.println("try-catch捕捉到異常,使用setAccessible()方法更改成員變量權(quán)限");method[i].setAccessible(true);try {System.out.println("修改權(quán)限后,調(diào)用了Demo類的minus()方法");method[i].invoke(demo,100,350);System.out.println("-------------------------------------");} catch (Exception e2) {e2.printStackTrace();} }}}
}
? ? ? ? 運行結(jié)果:?
? ? ? ? ?如圖所示,Use類通過equals方法判斷method數(shù)組中各個對應(yīng)的方法,然后使用invoke()方法,輸入被調(diào)用的類的實例化對象,調(diào)整方法引用參數(shù),運行方法。有了異常后更改方法的權(quán)限,運行catch語句代碼。
總結(jié)
????????以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了訪問成員方法的使用,而Method類提供了大量能使我們便捷地實時處理數(shù)據(jù)的方法,該類處于java.lang.reflect包下,指正和補充的內(nèi)容歡迎在評論區(qū)中留言。