java 反照调用类的方法
java 反射调用类的方法
最近遇到一个问题,重复的写一些方法,这些方法基本除了调用对象的方法不同外其他的都相同,发现这个相同点后,就在考虑怎么写一个方法,只需要传入对象方法的名字就可以对方法进行调用。
这里会用到java反射:
首先建立一个使用反射调用的类Computer:
package com; public class Computer { public Computer(){ super(); } public void surfInternet(){ System.out.println("网上冲浪"); } public void watchTV(){ System.out.println("网上看电视"); } public void workOffice(){ System.out.println("网上办公"); } public int getLength(String str){ System.out.print("字符长度为: "); return str.length(); } public static String getName(String name){ return name; } }
下面我写一个反射调用的主函数:
package com; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestReflect1 { public static Object invokeMethod(Method method,Object obj,Object...args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{ return method.invoke(obj, args); } public static void main(String[] args) { try { int len = (Integer)invokeMethod(Computer.class.getMethod("getLength", String.class),Computer.class.newInstance(),"HP"); System.out.println(len); String str = (String)invokeMethod(Computer.class.getMethod("getName", String.class),null,"HP"); System.out.println(str); String [] strs = new String[]{ "watchTV","surfInternet","workOffice" }; for(int i=0;i<strs.length;i++) invokeMethod(Computer.class.getMethod(strs[i], null), Computer.class.newInstance(), null); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } }
比较下面的代码:
int len = (Integer)invokeMethod(Computer.class.getMethod("getLength", String.class),Computer.class.newInstance(),"HP"); System.out.println(len); String str = (String)invokeMethod(Computer.class.getMethod("getName", String.class),null,"HP"); System.out.println(str);
发现一个传入了对象一个没有传入对象,原因是在于一个为成员方法,一个为静态方法,静态方法可以说是在类加载的时候就已经创建了,而成员方法必须是对象创建是才被创建,所以成员方法必须加入对象。
再看下面的调用:
String [] strs = new String[]{ "watchTV","surfInternet","workOffice" }; for(int i=0;i<strs.length;i++) invokeMethod(Computer.class.getMethod(strs[i], null), Computer.class.newInstance(), null);
Computer中含有3个类似的方法,而且参数基本相同,所以我就使用一个数组的方式来对这个对象进行调用,而不是直接通过对象调用方法。
这样做就可以在进行相似处理时传入对象的方法来进行调用。
但是使用反射后运行效率会下降,但是代码的重用性却提高了不少。