美文网首页
java 反射访问变量速度测试(jdk1.8)

java 反射访问变量速度测试(jdk1.8)

作者: wine_5664 | 来源:发表于2019-08-26 15:15 被阅读0次

一百万次字段访问时间简单统计:
直接访问的耗时(78毫秒左右)
jdk反射访问耗时(190毫秒左右)
jdk反射访问(除去getDeclaredField)耗时(80毫秒左右)
cglib访问的耗时(75毫秒左右)

public class ReflectionTest {

    static class User{
        private String name;
        public User() {
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    /**
     * 测试直接访问的耗时(78毫秒左右)
     */
    @Test
    public void testDirectAccess(){
        countTime(user -> user.getName());
    }

    /**
     * 测试jdk反射访问耗时(190毫秒左右)
     */
    @Test
    public void testJdkReflectionAccess(){
        countTime(user -> {
            final Class<? extends User> userClass = user.getClass();
            try {
                final Field name = userClass.getDeclaredField("name");
                name.setAccessible(true);
                return (String) name.get(user);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    /**
     * 测试jdk反射访问耗时(80毫秒左右)
     */
    @Test
    public void testJdkReflectionAccess2() throws Exception{
        final Field name = User.class.getDeclaredField("name");
        countTime(user -> {
            try {
                name.setAccessible(true);
                return (String) name.get(user);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    /**
     * 测试cglib访问的耗时(75毫秒左右)
     */
    @Test
    public void testCglibReflectionAccess(){
        final FastClass fastClass = FastClass.create(User.class);
        final FastMethod name = fastClass.getMethod("getName", null);
        countTime(user -> {
            try {
                return (String) name.invoke(user,null);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            }
        });

    }

    private void countTime(Function<User, String> function) {
        final User user = new User();
        user.setName("test");
        final Instant start = Clock.systemDefaultZone().instant();
        String name = "";
        for(int i=0;i<1000*1000;i++){
            name = function.apply(user) + i;
        }
        final long millis = Duration.between(start, Clock.systemDefaultZone().instant()).toMillis();
        System.err.println(name);
        System.err.println(millis);
    }
}

相关文章

  • java 反射访问变量速度测试(jdk1.8)

    一百万次字段访问时间简单统计:直接访问的耗时(78毫秒左右)jdk反射访问耗时(190毫秒左右)jdk反射访问(除...

  • java 反射全面总结

    反射总结慕课网 反射的视频 什么是反射 反射是能够让java代码访问一个已经加载的类的字段,变量,方法和构造器等信...

  • 面试刷题6:反射和动态代理是什么?

    反射和动态代理是什么? 反射是java提供的一种自省能力,可以在运行时创建类的实例,访问成员变量,方法。 动态代理...

  • Java通过反射访问成员变量(转)

    来自:http://c.biancheng.net/view/1112.html 通过下列任意一个方法访问成员变量...

  • Jmeter性能测试

    [TOC] 一、环境搭建 1、安装java 安装jdk1.8:默认安装 配置环境变量: 新建系统变量JAVA_HO...

  • Java基础之反射

    Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...

  • 反射

    Class类与Java反射 通过反射可访问的主要描述信息 访问构造方法 Constructor类的常用方法 Mod...

  • Class类与JAVA反射

    Class类与JAVA反射通过反射可以访问的主要信息 包路径 getPackage() Package对象 ...

  • Java面试题(反射)

    57. 什么是反射? 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 Java反射: 在Java运...

  • Java基础-反射(4)

    57. 什么是反射? 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力 Java反射: 在Java运...

网友评论

      本文标题:java 反射访问变量速度测试(jdk1.8)

      本文链接:https://www.haomeiwen.com/subject/ltzrectx.html