千家信息网

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

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇文章给大家分享的是有关Java中怎么利用反射获取类方法速率,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。反射介绍Java反射是指在程
千家信息网最后更新 2025年02月01日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;@Slf4jpublic 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:33reflect call:126cache call:16

结果分析

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

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

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

0