温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-06-21 18:16:31 来源:亿速云 阅读:151 作者:Leah 栏目:大数据

本篇文章给大家分享的是有关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中怎么利用反射获取类方法速率,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI