1. 测试三种方式
-
普通方式
new 对象,调用方法。输出前后执行时间。 -
反射方式调用
根据对象反射出 Class 类,获得类的方法,然后调用方法执行,输出前后执行时间。 -
反射方式调用,关闭检测
与方式二基本一致,只是关闭权限检测
getName.setAccessible(true);
2. 代码实现
package com.dingha.reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//分析性能问题
public class Test10 {
//1.普通方式调用
public static void test01(){
User user = new User();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
user.getName();
}
long endTime = System.currentTimeMillis();
System.out.println("普通方式"+(endTime-startTime)+"ms");
}
//2.反射方式调用
public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
Class c1 = user.getClass();
Method getName = c1.getMethod("getName", null);
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
getName.invoke(user,null);
}
long endTime = System.currentTimeMillis();
System.out.println("反射方式"+(endTime-startTime)+"ms");
}
//3.反射方式调用,关闭检测
public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
User user = new User();
Class c1 = user.getClass();
Method getName = c1.getMethod("getName", null);
getName.setAccessible(true);//关闭权限检查
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
getName.invoke(user,null);
}
long endTime = System.currentTimeMillis();
System.out.println("关闭检测"+(endTime-startTime)+"ms");
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
//方法要是静态方法,才可以直接调用
test01();
test02();
test03();
}
}
3. 结果
所以正常方式调用方法性能最好,关闭权限检测也可以提高性能