最近遇到一个问题,重复的写一些方法,这些方法基本除了调用对象的方法不同外其他的都相同,发现这个相同点后,就在考虑怎么写一个方法,只需要传入对象方法的名字就可以对方法进行调用。
这里会用到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个类似的方法,而且参数基本相同,所以我就使用一个数组的方式来对这个对象进行调用,而不是直接通过对象调用方法。
这样做就可以在进行相似处理时传入对象的方法来进行调用。
但是使用反射后运行效率会下降,但是代码的重用性却提高了不少。