反射带来了编程的灵活性,但是他的执行效率相比于常规调用要低。(禁用安全检查可以稍微缓解)
所以最好是在必须得用反射的情况下再用反射。
以如下代码为例,通过两种方式调用某个方法1000000000L次
private static void test1(){ User u=new User(); long startTime=System.currentTimeMillis(); for(int i=0; i<1000000000L; i++) u.getName(); long endTime=System.currentTimeMillis(); System.out.println("普通调用方式耗时:"+(endTime-startTime)+"ms");
}
private static void test2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ User u=new User(); long startTime=System.currentTimeMillis();
Class<? extends User> class1 = u.getClass(); Method declaredMethod = class1.getDeclaredMethod("getName", null); declaredMethod.setAccessible(false);
for(int i=0; i<1000000000L; i++){ declaredMethod.invoke(u, null); }
long endTime=System.currentTimeMillis(); System.out.println("反射调用方式(禁用安全检查)耗时:"+(endTime-startTime)+"ms");
}
private static void test3() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ User u=new User(); long startTime=System.currentTimeMillis();
Class<? extends User> class1 = u.getClass(); Method declaredMethod = class1.getDeclaredMethod("getName", null);
for(int i=0; i<1000000000L; i++){ declaredMethod.invoke(u, null); }
long endTime=System.currentTimeMillis(); System.out.println("反射调用方式耗时:"+(endTime-startTime)+"ms");
} |