美文网首页
安利一个优雅的Java反射工具

安利一个优雅的Java反射工具

作者: 风云不羁 | 来源:发表于2019-05-09 11:38 被阅读0次

Java开发中或多或少的会用到反射的方式,通常的反射方式调用如下:

    public class Person {
        private String name;

        public Person(String name) {
            this.name = name;
        }

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

    public String getPersonName(Person person) {
        Class pClass = person.getClass();
        try {
            Field nameField = pClass.getDeclaredField("name");
            return (String) nameField.get(person);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }
    
    public void setPersonName(Person person, String name) {
        Class pClass = person.getClass();
        try {
            Method setName;
            setName = pClass.getDeclaredMethod("setName", pClass, String.class);
            setName.setAccessible(true);
            setName.invoke(person, name);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

每一次的反射调用都让人觉得代码有很多冗余的地方,我们总是希望调用的代码显得优雅而简洁。
下面就让我们来欣赏一下优雅的方式:

    public String getName(Person person) {
        try {
            return Reflect.on(person).get("name");
        } catch (Reflect.ReflectException e) {
            return null;
        }
    }
    
    public void setName(Person person, String name) {
        try {
            Reflect.on(person).call("setName", name);
        } catch (Reflect.ReflectException e) {
            e.printStackTrace();
        }
    }

该反射工具的源码地址 jOOR
这个工具的封装的功能基本覆盖反射调用所有方式,感兴趣的看官可以去看一下源码及使用方式。另外该库还支持Java代码的运行时编译:

Supplier<String> supplier = Reflect.compile(
    "com.example.HelloWorld",
    "package com.example;\n" +
    "class HelloWorld implements java.util.function.Supplier<String> {\n" +
    "    public String get() {\n" +
    "        return \"Hello World!\";\n" +
    "    }\n" +
    "}\n").create().get();

// Prints "Hello World!"
System.out.println(supplier.get());

扩展

如果项目中同一种反射的调用次数比较频繁的情况下,可以做缓存处理,避免每次都直接反射属性或者方法:

    //缓存ClassName对应的Class
    private static ConcurrentHashMap<String, Class> classCache;
    //缓存属性值
    private static ConcurrentHashMap<String, Field> fieldCache;
    //缓存方法
    private static ConcurrentHashMap<String, Method> methodCache;

    static {
        classCache = new ConcurrentHashMap<>();
        fieldCache = new ConcurrentHashMap<>();
        methodCache = new ConcurrentHashMap<>();
    }

相关文章

  • 安利一个优雅的Java反射工具

    Java开发中或多或少的会用到反射的方式,通常的反射方式调用如下: 每一次的反射调用都让人觉得代码有很多冗余的地方...

  • Spring注解原理探索(三)

    之 Java如何识别注解 关键词:Java 反射java.lang.reflect 包,实现反射功能的工具类。注解...

  • java之反射的应用

    Java的反射库是一个被精心设计的工具集,使用它编写和动态的操纵java代码。 那么java的反射能做什么呢?官方...

  • Kotlin(七)元编程

    回顾一下反射 很多框架和工具中,在Java领域你会看到很多反射的影子,Java的反射只是元编程的一种方式。 看一个...

  • Java拾遗:006 - Java反射与内省

    反射 Java中提供了一套精心设计的工具集,以便编写能够动态操纵Java代码的程序,这套工具集就是反射(refle...

  • 深入java反射

    概念:反射(Reflection)是Java 程序开发语言的特征之一,反射也是java中一种强大的工具,能够使我们...

  • 反射创建实例

    本文介绍Java反射的一个应用:已知类名和属性值,利用反射原理,创建类的实例。 工具:Class.newInsta...

  • ITEM 65: 使用接口而不是反射

    ITEM 65: PREFER INTERFACES TO REFLECTION  核心反射工具 java.lan...

  • 反射工具类,如斯优雅

    Foreword 反射的作用我在这就不多说了,每次用到反射都是那么一坨代码丢进去,总是让人觉得很不优雅,如今有了我...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

网友评论

      本文标题:安利一个优雅的Java反射工具

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