java利用反射获取指定字段名的值和设置字段的值

博客围绕Java操作展开,主要涉及获取和设置指定字段的值。需求是用户设置要显示的字段,如姓名、性别、年龄,需从包含这些字段的数据库实体类中匹配获取对应值,还提到了设置字段值的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.获取指定字段的值

  • 需求:
  • 用户设置要显示的字段,比如用户选择要显示的字段是:姓名,性别,年龄这三个字段,其余字段就不显示
  • 查询数据库获得的实体类里面包含了用户需要显示的字段,如何通过用户选择的字段去匹配获取相对应的值?
@Data
public class Student {

    private String name ;

    private int age ;
}
public class Test {

    static Class clazz1= Student.class;

    public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {

        Student student=new Student();
        student.setName("张三");
        student.setAge(20);

        //方式1
        String fieldName="name";
        //通过字符串的变化拼接处getName,即获取name的get方法
        String	methodName="get"+
                fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
        Method method = clazz1.getMethod(methodName);
        Object object = method.invoke(student);
        System.out.println(object.toString());//输出:张三

        //方式2

        //假设选择要现实的字段是name和age两个,或者多个以上
        String[] strArr = new String[]{"name","age"};
        Map resultMap = new HashMap();
        for (String s : strArr) {
            Field field = clazz1.getDeclaredField(s);//获取私有字段
            field.setAccessible(true);//设置权限
            Object object2 = field.get(student);//该参数为想要获取值得对象

            System.out.println(object2.toString());
            resultMap.put(s,object2.toString());
        }
        System.out.println(resultMap);

        //map转实体类
        Student student2=new Student();
        student2 = JSON.parseObject(JSON.toJSONString(resultMap), Student.class);

        System.out.println(student2);
    }
}

测试输出
在这里插入图片描述

二.设置字段的值

//设置字段的值
        //方式一
        Field field = clazz1.getDeclaredField("name");
        Object object3=clazz1.newInstance();
        field.setAccessible(true);
        field.set(object3,"王五");
        Student student3=(Student) object3;
        System.out.println(student3.getName());
        //方式二

        Student student4=new Student();
        String fieldName2="name";
        String methodName2="set"+fieldName2.substring(0,1).toUpperCase()+
                fieldName.substring(1);
        Method method2 = clazz1.getMethod(methodName2,String.class);
        method2.invoke(student4, "李四");
        System.out.println(student4.getName());
### 使用Java反射机制获取对象字段及其 通过Java反射API可以动态地访问类的信息以及操作其成员变量。为了获取对象的字段名它们当前存储的具体数,下面提供了一个具体的例子说明这一过程。 对于给定的对象实例,可以通过`getDeclaredFields()`方法获得该类声明的所有字段(包括私有字段),而不仅仅是公共字段。接着遍历这些字段并调用`setAccessible(true)`使得即使是私有的也可以被读取或修改。最后利用`get(Object obj)`函数来取得指定对象上此Field表示的字段[^1]。 ```java import java.lang.reflect.Field; public class ReflectionExample { static class Person { private String name = "John"; public int age = 27; } public static void main(String[] args) throws Exception { Object personInstance = new Person(); Class<?> clazz = personInstance.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // Make sure we can access non-public members as well. field.setAccessible(true); System.out.print("Field Name: " + field.getName()); System.out.println(", Value: " + field.get(personInstance)); } } } ``` 这段代码创建了一个名为`Person`的简单类,并为其定义了一些属性。之后,在主程序中使用反射技术打印出了这个类所有字段的名字连同它们各自的初始设定。注意这里不仅限于公开(public)成员;即使是对其他包隐藏(private)的数据项也能成功检索到[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值