這個應用的目的是,傳入類名,傳入方法名,傳入調用的參數便可以調用制定類下的制定方法。java
這個應用的好處是,類名和方法名從配置文件中讀入,能夠改變。相似於一個小型的類加載,而後實例化,而後調用。因此,這個例子對理解JDK加載類也有點點好處。ide
這個應用中包含三個類。測試
Calculator:這個類是對計算器的簡單建模。用來做測試的。spa
MethodInvoker:這個類有兩個方法,是核心。weakInvoke和Invoke。關於這兩個方法的解釋在代碼註釋中。blog
InvokerTest:測試驅動。get
Calculator.javastring
- public class Calculator {
- public int add(int a,int b){
- return a+b;
- }
- public int sub(int a,int b){
- return a-b;
- }
- public int multify(int a,int b){
- return a*b;
- }
- public int div(int a,int b){
- if(b!=0)
- return a/b;
- return 0;
- }
- public int add(int a,int b,int c)
- {
- return a+b+c;
- }
- }
MethodInvoker.javait
- public class MethodInvoker {
- /**
- * 傳入類名便可調用,可是不支持含有簡單類型的方法,由於簡單類型回自動打包
- * @param className 要調用的類
- * @param methodName 要調用的方法
- * @param params 調用的參數
- * @return 調用後的結果
- */
- public static Object weakInvoke(String className,String methodName,Object[] obj)
- {
- try {
- Class c = Class.forName(className);
- Class[] paraClasses=new Class[obj.length];
- for(int i=0;i<obj.length;i++)
- {
- paraClasses[i]=obj[i].getClass();
- }
- try {
- Method m=c.getMethod(methodName, paraClasses);
- Object instance=c.newInstance();
- return m.invoke(instance, obj);
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
- } catch (ClassNotFoundException e1) {
- e1.printStackTrace();
- }
- return null;
- }
- /**
- * 動態方法調用
- * @param className 要調用的類
- * @param methodName 要調用的方法
- * @param params 調用的參數
- * @return 調用後的結果
- */
- public static Object invoke(String className,String methodName,Object[] params)
- {
- Object returnObj=null;
- try {
- Class c= Class.forName(className);
- Method[] ms=c.getMethods();
- Object obj=c.newInstance();
- for(int i=0;i<ms.length;i++)
- {
- Method m=ms[i];
- if(m.getName().endsWith(methodName))
- {
- try {
- returnObj=m.invoke(obj, params);
- } catch (IllegalArgumentException e) {//參數錯誤
- returnObj=null;
- continue;
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- break;
- }
- break;
- }
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return returnObj;
- }
- }
InvokerTest.javaio
- public class InvokerTest {
- public static void main(String[] args) {
- try {
- PropertyReader reader=new PropertyReader("invoke.properties");
- String name=reader.getProperty("class");
- String method=reader.getProperty("method");
- Object[] params=new Object[]{1,2};
- System.out.println(MethodInvoker.invoke(name, method,params));
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- }
- }
- }
invoke.properties直接放在工程根路徑下,invoke.properties中的內容。class
- class=neu.swc.tzy.methods.Calculator
- method=add
執行結果:3.
若是把InvokeTest中的Object[] params=new Object[]{1,2};改成Object[] params=new Object[]{1,2,3};則能夠正確地返回結果6.也就是說,該應用支持重載的方法調用。
若是把配置文件中的method改成sub便可以變爲減法。
屬性配置文件讀取的方法見:http://snowteng17.blog.51cto.com/1532294/330459