反射的优缺点
- 优点:可以动态地创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。
- 缺点:使用反射基本是解释执行,对执行速度有影响
反射调用优化 - 关闭访问检查
Method 和 Field、Constructor
对象都有 setAccessible()
方法setAccessible()
方法的作用是启动和禁用访问安全检查的开关- 参数值为
true
表示反射的对象在使用时取消访问检查,提高反射的效率 - 参数值为
false
则表示反射的对象执行访问检查
package reflection_;
import java.lang.reflect.Method;
public class Reflection02 {
public static void main(String[] args) throws Exception {
m1();
m2();
m3();
}
public static void m1(){
Cat cat = new Cat();
long start = System.currentTimeMillis();
for (int i = 0; i < 900000000; i++) {
cat.hello();
}
long end = System.currentTimeMillis();
System.out.println("m1() 耗时 " + (end - start));
}
public static void m2() throws Exception{
Class aClass = Class.forName("reflection_.Cat");
Object o = aClass.newInstance();
Method hello = aClass.getMethod("hello");
long start = System.currentTimeMillis();
for (int i = 0; i < 900000000; i++) {
hello.invoke(o);
}
long end = System.currentTimeMillis();
System.out.println("m2() 耗时 " + (end - start));
}
public static void m3() throws Exception{
Class aClass = Class.forName("reflection_.Cat");
Object o = aClass.newInstance();
Method hello = aClass.getMethod("hello");
hello.setAccessible(true);
long start = System.currentTimeMillis();
for (int i = 0; i < 900000000; i++) {
hello.invoke(o);
}
long end = System.currentTimeMillis();
System.out.println("m2() 耗时 " + (end - start));
}
}