Home Tags Posts tagged with "性能分析"

性能分析

在我们的框架使用中大量运用到反射机制,我们以后的开发也必然会使用到反射,那么反射的性能分析就很有必要了,这篇文章将通过代码实例的方式为您对比反射和new之间调用方法及创建对象的性能,以及小小的优化(代码地址:Desktop\个人学习代码\Reflection)

 

package com.yang.reflection;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 测试New调用对象方法和反射调用对象方法的性能
 * test01:New
 * test02:Reflection
 * test03:关闭安全检查的反射
 * 注:如不关闭安全检查则无法修改私有属性
 */
public class ReflectionVsNew_Method {

    public static void test01(){
        long startTime = System.currentTimeMillis();
        User user = new User();
        for (int i = 0; i < 1000000000; i++) {
            user.getName();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("New方法所消耗的时间为:"+(endTime-startTime)+"ms");
    }

    /**
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     *
     * getDeclaredMethod(name,parameterTypes)
     * @param name 方法名
     * @param parameterTypes 方法所需要传入的参数
     *
     * method.invoke(object,args)
     * @param object 执行方法的对象
     * @param args 方法所需要传入的参数
     */
    public static void test02() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        long startTime = System.currentTimeMillis();
        User user = new User();
        Class c1= Class.forName("com.yang.reflection.User");
        Method getName = c1.getDeclaredMethod("getName", null);
        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(user,null);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("反射方法所消耗的时间为:"+(endTime-startTime)+"ms");
    }

    //反射方式调用,关闭检测
    public static void test03() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        long startTime = System.currentTimeMillis();
        User user = new User();
        Class c1= Class.forName("com.yang.reflection.User");
        Method getName = c1.getDeclaredMethod("getName", null);
        getName.setAccessible(true);
        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 ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        test01();
        System.out.println("===========================");
        test02();
        System.out.println("===========================");
        test03();
    }

}

总结:
反射比new大概慢了400倍
关闭安全检查后,大概慢了200倍

反射调用方法四部曲
    1.传入需要调用方法的所属对象
    2.获取该对象对应的Class对象
    3.通过Class对象得到需要调用的方法
    4.执行方法名.invoke()