为了实现代码的耦合,考虑使用反射机制来调用函数,调用关系写在配置文件中。
但是这样能满足性能需求吗,编写以下程序做了个测试。
public class Main {
public static void main(String[] args) throws Exception {
String aa = "sadfa";
long startTime = System.currentTimeMillis(); // 获取开始时间
for (int i = 0; i < 1000000; i++) {
aa.indexOf("fa");
}
long endTime = System.currentTimeMillis(); // 获取结束时间
System.out.println("非反射运行时间: " + (endTime - startTime) + "ms");
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
invokeMethod(aa, "indexOf", new Object[] { "fa" });
}
endTime = System.currentTimeMillis();
System.out.println("反射运行时间: " + (endTime - startTime) + "ms");
}
public static Object invokeMethod(Object owner, String methodName,
Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
}
执行结果为:
非反射运行时间: 16ms
反射运行时间: 1203ms
可见,用反射调用函数所耗用时间大概接近不用反射的100倍。
但是,即使用反射,100万次的调用也只耗时1.2秒,在性能要求不高,或调用次数不是特别频繁的时候,可以考虑使用反射。