小白都能学会的Java注解与反射机制 (5)

前面我们说过,反射对性能有一定影响。因为反射是一种解释操作,它总是慢于直接执行相同的操作。而且Method,Field,Constructor都有setAccessible()方法,它的作用是开启或禁用访问安全检查。如果我们程序代码中用到了反射,而且此代码被频繁调用,为了提高反射效率,则最好禁用访问安全检查,即设置为true。

package com.nobody; import java.lang.reflect.Method; public class TestReflectSpeed { // 10亿次 private static int times = 1000000000; public static void main(String[] args) throws Exception { test01(); test02(); test03(); } public static void test01() { Teacher t = new Teacher(); long start = System.currentTimeMillis(); for (int i = 0; i < times; i++) { t.getName(); } long end = System.currentTimeMillis(); System.out.println("普通方式执行10亿次消耗:" + (end - start) + "ms"); } public static void test02() throws Exception { Teacher teacher = new Teacher(); Class<?> aClass = Class.forName("com.nobody.Teacher"); Method getName = aClass.getDeclaredMethod("getName"); long start = System.currentTimeMillis(); for (int i = 0; i < times; i++) { getName.invoke(teacher); } long end = System.currentTimeMillis(); System.out.println("反射方式执行10亿次消耗:" + (end - start) + "ms"); } public static void test03() throws Exception { Teacher teacher = new Teacher(); Class<?> aClass = Class.forName("com.nobody.Teacher"); Method getName = aClass.getDeclaredMethod("getName"); getName.setAccessible(true); long start = System.currentTimeMillis(); for (int i = 0; i < times; i++) { getName.invoke(teacher); } long end = System.currentTimeMillis(); System.out.println("关闭安全检查反射方式执行10亿次消耗:" + (end - start) + "ms"); } } class Teacher { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } //输出结果 普通方式执行10亿次消耗:13ms 反射方式执行10亿次消耗:20141ms 关闭安全检查反射方式执行10亿次消耗:8233ms

通过实验可知,反射比直接执行相同的方法慢了很多,特别是当反射的操作被频繁调用时效果更明显,当然通过关闭安全检查可以提高一些速度。所以,放射也不应该泛滥成灾的,而是适度使用才能发挥最大作用。

小白都能学会的Java注解与反射机制

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzgwy.html