Java中怎么利用反射获取类方法速率

本篇文章给大家分享的是有关Java中怎么利用反射获取类方法速率,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联公司是一家集网站建设,宁波企业网站建设,宁波品牌网站建设,网站定制,宁波网站建设报价,网络营销,网络优化,宁波网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

反射介绍

Java反射是指在程序运行状态中,能检查任意对象的内容并调用任意方法。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

测试代码

反射调用的类

public class ClassA {
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}

测试主类

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Method;


@Slf4j
public class MapMain {
    private static final int COUNT = 100000;

    public static void main(String[] args) {
        System.out.println("starting ...");
        long start = System.currentTimeMillis();
        for (int i = 0; i < COUNT; i++) {
            ClassA clzA = new ClassA();
            clzA.setName("A" + i);
        }
        long end = System.currentTimeMillis();
        long diff = end - start;
        System.out.println("native call:" + diff);

        try {
            long start2 = System.currentTimeMillis();
            for (int i = 0; i < COUNT; i++) {
                Class clzA = Class.forName("com.yq.myreflect.ClassA");
                Class[] argsType = new Class[1];
                argsType[0] = String.class;
                Method m = clzA.getMethod("setName", argsType);
                Object obj = clzA.newInstance();
                m.invoke(obj, "A" + i);

            }
            long end2 = System.currentTimeMillis();
            long diff2 = end2 - start2;
            System.out.println("reflect call:" + diff2);
        } catch (Exception ex) {
            ex.printStackTrace();
        }


        try {
            long start3 = System.currentTimeMillis();
           //缓存类,避免多次查找
            Class clzA = Class.forName("com.yq.myreflect.ClassA");
            Class[] argsType = new Class[1];
            argsType[0] = String.class;
            //缓存方法,避免多次查找
            Method m = clzA.getMethod("setName", argsType);
            for (int i = 0; i < COUNT; i++) {
                Object obj = clzA.newInstance();
                m.invoke(obj, "A" + i);
            }
            long end3 = System.currentTimeMillis();
            long diff3 = end3 - start3;
            System.out.println("cache call:" + diff3);
        } catch (Exception ex) {
            ex.printStackTrace();
        }


    }
}

测试结果

多次运行的平均结果

starting ...
native call:33
reflect call:126
cache call:16

结果分析

可以看到如果我们缓存了类,以及要调用的方法后,使用反射比直接调用还快。

	//缓存类,避免多次查找
        Class clzA = Class.forName("com.yq.myreflect.ClassA");
        Class[] argsType = new Class[1];
        argsType[0] = String.class;
        //缓存方法,避免多次查找

以上就是Java中怎么利用反射获取类方法速率,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网站名称:Java中怎么利用反射获取类方法速率
标题路径:http://myzitong.com/article/ppjpgi.html