反射工具-ReflectUtil

这篇具有很好参考价值的文章主要介绍了反射工具-ReflectUtil。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 介绍

Java的反射机制,可以让语言变得更加灵活,对对象的操作也更加“动态”,因此在某些情况下,反射可以做到事半功倍的效果。Hutool针对Java的反射机制做了工具化封装,封装包括:

  • 获取构造方法
  • 获取字段
  • 获取字段值
  • 获取方法
  • 执行方法(对象方法和静态方法)

2 使用

2.1 获取构造方法

反射工具-ReflectUtil

2.2 获取字段

为了看到效果,先随便建两个类:

@Data
@Accessors(chain = true)
public class User {

    private String userName;

    private int userAge;

    private String userIdCard;

}

@Data
@Accessors(chain = true)
public class Student extends User{

    private String grade;

    private String schoolName;

}
  • 获得一个类中所有字段列表,包括其父类中的字段
public static void main(String[] args) {
        Field[] fields = ReflectUtil.getFields(Student.class);
        for (Field field : fields) {
            System.out.println(field.getName());
        }
}

输出:

grade
schoolName
userName
userAge
userIdCard
  • 获取指定类中字段名和字段对应的有序Map,包括其父类中的字段
public static void main(String[] args) {
        Map<String, Field> fieldMap = ReflectUtil.getFieldMap(Student.class);
        System.out.println("获取指定类中字段名和字段对应的有序Map,包括其父类中的字段:" + fieldMap);
}

反射工具-ReflectUtil

2.3 获取字段值

public static void main(String[] args) {
        User user = new Student()
                .setSchoolName("xx小学")
                .setGrade("3")
                .setUserName("小明")
                .setUserAge(9);

        Object[] fieldsValue = ReflectUtil.getFieldsValue(user);
        System.out.println("获取所有字段的值:" + StrUtil.join(",", fieldsValue));
}

执行结果:

获取所有字段的值:3,xx小学,小明,9,null
获取指定字段值:小明

2.4 获取方法

  • 获取某个类的所有方法 getMethods

那就通过这个方法看一下ReflectUtil这个工具类都有哪些方法吧:

public static void main(String[] args) {
        // 获取某个类的所有方法
        Method[] methods = ReflectUtil.getMethods(ReflectUtil.class);
        System.out.println("获取某个类的所有方法:");
        for (Method method : methods) {
            System.out.println(method);
        }
}

结果:

获取某个类的所有方法:
public static java.lang.Object cn.hutool.core.util.ReflectUtil.invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object[]) throws cn.hutool.core.exceptions.UtilException
public static java.lang.Object cn.hutool.core.util.ReflectUtil.invoke(java.lang.Object,java.lang.String,java.lang.Object[]) throws cn.hutool.core.exceptions.UtilException
public static java.lang.reflect.Constructor cn.hutool.core.util.ReflectUtil.getConstructor(java.lang.Class,java.lang.Class[])
public static java.lang.reflect.Constructor[] cn.hutool.core.util.ReflectUtil.getConstructors(java.lang.Class) throws java.lang.SecurityException
public static java.lang.reflect.Field cn.hutool.core.util.ReflectUtil.getField(java.lang.Class,java.lang.String) throws java.lang.SecurityException
public static java.lang.reflect.Field[] cn.hutool.core.util.ReflectUtil.getFields(java.lang.Class) throws java.lang.SecurityException
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethod(java.lang.Class,boolean,java.lang.String,java.lang.Class[]) throws java.lang.SecurityException
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethod(java.lang.Class,java.lang.String,java.lang.Class[]) throws java.lang.SecurityException
public static java.lang.reflect.Method[] cn.hutool.core.util.ReflectUtil.getMethods(java.lang.Class) throws java.lang.SecurityException
public static java.lang.reflect.Method[] cn.hutool.core.util.ReflectUtil.getMethods(java.lang.Class,cn.hutool.core.lang.Filter) throws java.lang.SecurityException
public static java.lang.Object cn.hutool.core.util.ReflectUtil.newInstance(java.lang.Class,java.lang.Object[]) throws cn.hutool.core.exceptions.UtilException
public static java.lang.Object cn.hutool.core.util.ReflectUtil.newInstance(java.lang.String) throws cn.hutool.core.exceptions.UtilException
public static java.lang.reflect.AccessibleObject cn.hutool.core.util.ReflectUtil.setAccessible(java.lang.reflect.AccessibleObject)
public static java.lang.Object cn.hutool.core.util.ReflectUtil.invokeStatic(java.lang.reflect.Method,java.lang.Object[]) throws cn.hutool.core.exceptions.UtilException
public static java.lang.Object[] cn.hutool.core.util.ReflectUtil.getFieldsValue(java.lang.Object)
public static java.lang.Object cn.hutool.core.util.ReflectUtil.getFieldValue(java.lang.Object,java.lang.String) throws cn.hutool.core.exceptions.UtilException
public static java.lang.Object cn.hutool.core.util.ReflectUtil.getFieldValue(java.lang.Object,java.lang.reflect.Field) throws cn.hutool.core.exceptions.UtilException
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethodOfObj(java.lang.Object,java.lang.String,java.lang.Object[]) throws java.lang.SecurityException
public static boolean cn.hutool.core.util.ReflectUtil.isHashCodeMethod(java.lang.reflect.Method)
public static void cn.hutool.core.util.ReflectUtil.setFieldValue(java.lang.Object,java.lang.String,java.lang.Object) throws cn.hutool.core.exceptions.UtilException
public static void cn.hutool.core.util.ReflectUtil.setFieldValue(java.lang.Object,java.lang.reflect.Field,java.lang.Object) throws cn.hutool.core.exceptions.UtilException
public static boolean cn.hutool.core.util.ReflectUtil.hasField(java.lang.Class,java.lang.String) throws java.lang.SecurityException
public static boolean cn.hutool.core.util.ReflectUtil.isEqualsMethod(java.lang.reflect.Method)
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethodByName(java.lang.Class,boolean,java.lang.String) throws java.lang.SecurityException
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethodByName(java.lang.Class,java.lang.String) throws java.lang.SecurityException
public static java.lang.String cn.hutool.core.util.ReflectUtil.getFieldName(java.lang.reflect.Field)
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getPublicMethod(java.lang.Class,java.lang.String,java.lang.Class[]) throws java.lang.SecurityException
public static boolean cn.hutool.core.util.ReflectUtil.isToStringMethod(java.lang.reflect.Method)
public static java.util.Set cn.hutool.core.util.ReflectUtil.getMethodNames(java.lang.Class) throws java.lang.SecurityException
public static java.lang.reflect.Method[] cn.hutool.core.util.ReflectUtil.getPublicMethods(java.lang.Class)
public static java.util.List cn.hutool.core.util.ReflectUtil.getPublicMethods(java.lang.Class,cn.hutool.core.lang.Filter)
public static java.util.List cn.hutool.core.util.ReflectUtil.getPublicMethods(java.lang.Class,java.lang.String[])
public static java.util.List cn.hutool.core.util.ReflectUtil.getPublicMethods(java.lang.Class,java.lang.reflect.Method[])
public static boolean cn.hutool.core.util.ReflectUtil.isEmptyParam(java.lang.reflect.Method)
public static java.lang.Object cn.hutool.core.util.ReflectUtil.invokeWithCheck(java.lang.Object,java.lang.reflect.Method,java.lang.Object[]) throws cn.hutool.core.exceptions.UtilException
public static java.util.Map cn.hutool.core.util.ReflectUtil.getFieldMap(java.lang.Class)
public static java.lang.Object cn.hutool.core.util.ReflectUtil.getStaticFieldValue(java.lang.reflect.Field) throws cn.hutool.core.exceptions.UtilException
private static boolean cn.hutool.core.util.ReflectUtil.lambda$getPublicMethods$1(java.util.HashSet,java.lang.reflect.Method)
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethodByNameIgnoreCase(java.lang.Class,java.lang.String) throws java.lang.SecurityException
public static java.util.Set cn.hutool.core.util.ReflectUtil.getPublicMethodNames(java.lang.Class)
public static java.lang.reflect.Field[] cn.hutool.core.util.ReflectUtil.getFieldsDirectly(java.lang.Class,boolean) throws java.lang.SecurityException
public static java.lang.reflect.Constructor[] cn.hutool.core.util.ReflectUtil.getConstructorsDirectly(java.lang.Class) throws java.lang.SecurityException
public static java.lang.Object cn.hutool.core.util.ReflectUtil.newInstanceIfPossible(java.lang.Class)
private static boolean cn.hutool.core.util.ReflectUtil.lambda$getField$0(java.lang.String,java.lang.reflect.Field)
public static java.lang.reflect.Method cn.hutool.core.util.ReflectUtil.getMethodIgnoreCase(java.lang.Class,java.lang.String,java.lang.Class[]) throws java.lang.SecurityException
public static java.lang.reflect.Method[] cn.hutool.core.util.ReflectUtil.getMethodsDirectly(java.lang.Class,boolean) throws java.lang.SecurityException
private static boolean cn.hutool.core.util.ReflectUtil.lambda$getPublicMethods$2(java.util.HashSet,java.lang.reflect.Method)
protected void java.lang.Object.finalize() throws java.lang.Throwable
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
private static native void java.lang.Object.registerNatives()
  • 获取某个类的指定方法 getMethod
    此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null

下边这个方法也是ReflectUtil工具类中的,就指定获取这个方法吧:
反射工具-ReflectUtil
简单的测试一下:

public static void main(String[] args) {
        Method getMethod = ReflectUtil.getMethod(ReflectUtil.class, "isToStringMethod");
        System.out.println("获取某个类的指定方法:");
        System.out.println(getMethod);
        System.out.println("获取某个类的指定方法,加参数:");
        Method getMethodByParamType = ReflectUtil.getMethod(ReflectUtil.class, "isToStringMethod", Method.class);
        System.out.println(getMethodByParamType);
}

结果:

获取某个类的指定方法:
null
获取某个类的指定方法,加参数:
public static boolean cn.hutool.core.util.ReflectUtil.isToStringMethod(java.lang.reflect.Method)

2.5 执行方法

主要有以下三个方法可选:
反射工具-ReflectUtil
其中:

  • obj – 方法所在对象
  • methodName – 方法名
  • args – 参数列表

写一个测试类测试一下。
先随便建一个类:

public class TestInvokeMeth {

    public String test(String str) {
        System.out.println("你输入的字符为:" + str);
        return "这是返回的信息";
    }

}

测试方法:

public static void main(String[] args) {
        TestInvokeMeth testInvokeMeth = new TestInvokeMeth();
        Object getFields = ReflectUtil.invoke(testInvokeMeth, "test","你好");
        System.out.println("返回结果" + getFields);
}

执行结果:文章来源地址https://www.toymoban.com/news/detail-409338.html

你输入的字符为:你好
返回结果这是返回的信息

到了这里,关于反射工具-ReflectUtil的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简单介绍一下centos上有什么工具可以优雅的管理开机启动项

    在CentOS上,你可以使用以下工具来优雅地管理开机启动项: systemctl:systemctl 是 systemd 系统和服务管理器的主要命令。它提供了一种优雅的方式来管理启动项。你可以使用 systemctl 命令来启用、禁用、查看和管理系统服务。例如,要启用一个服务,可以使用 systemctl enable servi

    2024年02月11日
    浏览(48)
  • Java笔记040-反射/反射机制、Class类

    目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 代码解释部分 哪些类型有Class对象

    2024年02月09日
    浏览(47)
  • Java反射、代理机制

    官方解释:反射允许对封装类的字段、方法和构造方法的信息进行编程访问。 虚拟机加载类文件后,会在方法区生成一个类对象,包含了类的结构信息,如字段、方法、构造方法等。反射是一种能够在程序运行时动态访问、修改类对象中任意属性的机制(包括private属性)。

    2024年02月10日
    浏览(43)
  • C#的反射机制

    当谈到C#的反射机制时,它提供了一种 动态 地在运行时获取和操作类型信息的能力。通过反射,可以 在编译时未知的情况下 ,使用类型信息来创建对象、调用方法、访问属性和字段等。下面是一些反射机制的重要概念和用法: Type 类型:Type 类型表示在代码中定义的类型(

    2024年02月10日
    浏览(52)
  • Java反射机制是什么?

    Java 反射机制 是 Java 语言的一个重要特性。 在学习 Java 反射机制前,大家应该先了解两个概念,编译期和运行期。 编译期 是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把

    2024年02月12日
    浏览(38)
  • C# 反射机制详解

    Reflection,中文翻译为反射。 这是.Net中获取运行时类型信息的方式。 官方定义: 审查元数据并收集关于它的类型信息的能力。 元数据(编译以后的最基本数据单元) 就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义

    2024年02月07日
    浏览(43)
  • Java反射机制深入详解

    一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private,由JVM创建。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示

    2024年02月06日
    浏览(43)
  • 什么是反射机制

    1.什么是类对象: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。 比方有一个Hero类:类对象就是用于描述这种类,都有什么属性,什么方法的。 获取类对象有3种方式 Class.forName Hero.class new Hero().get

    2024年02月05日
    浏览(37)
  • Java的反射机制

    Java 的反射机制允许在程序运行期间,借助反射 API 获取类的内部信息,并能直接操作对象的内部属性及方法。 Java 反射机制提供的功能: 在运行时,使用反射分析类的能力,获取有关类的一切信息(类所在的包、类实现的接口、标注的注解、类的数据域、类的构造器、类的

    2024年02月02日
    浏览(40)
  • Java的反射机制(2)

    目录 Class类基本介绍 Class类的常用方法 如何获取class类对象 哪些类型有Class对象 Class类基本介绍 在Java语言中,每个对象都有一个运行时类,即其所属的类。而这个运行时类在Java中是以Class类的实例形式存在的,该Class类实例就是所谓的Class对象。Class类表示一个类或接口的元

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包