You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用Reflection类动态调用Getter和Setter方法?

动态访问Java类的Getter/Setter方法(无硬编码实现)

嘿,我来帮你搞定这个需求!要实现不硬编码就能动态调用这两个类的Getter和Setter方法,Java的反射机制就是绝佳方案。下面我一步步拆解思路和实现代码:


原有的Pojo类定义

public class AccountPojo {
    private String dataList;
    private String dataSet;

    public String getDataList() {
        return dataList;
    }

    public void setDataList(String dataList) {
        this.dataList = dataList;
    }

    public String getDataSet() {
        return dataSet;
    }

    public void setDataSet(String dataSet) {
        this.dataSet = dataSet;
    }
}

public class GetAccountsPojo {
    private String accountId;
    private int noOfAccounts;

    public String getAccountId() {
        return accountId;
    }

    public void setAccountId(String accountId) {
        this.accountId = accountId;
    }

    public int getNoOfAccounts() {
        return noOfAccounts;
    }

    public void setNoOfAccounts(int noOfAccounts) {
        this.noOfAccounts = noOfAccounts;
    }
}

你的Test类场景

你已经能动态加载类并实例化,接下来只需要补充动态调用Getter/Setter的逻辑:

public class Test {
    public static void main(String[] args) throws Exception {
        String className = "AccountPojo"; // 可切换为GetAccountsPojo
        Class<?> cls = Class.forName("com.org.temp." + className);
        Object clsInstance = cls.getConstructor().newInstance(); // 替代过时的newInstance()
        System.out.println("The cls is==" + cls+" and classInstance is=="+clsInstance);
        
        // 这里需要添加动态访问Getter和Setter的逻辑,不硬编码
    }
}

完整解决方案:用反射动态调用Getter/Setter

下面是实现代码,我加了详细注释帮你理解每一步:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        String className = "AccountPojo"; // 可切换为GetAccountsPojo
        Class<?> cls = Class.forName("com.org.temp." + className);
        Object clsInstance = cls.getConstructor().newInstance();
        
        // 1. 获取类的所有字段(包括私有字段)
        Field[] fields = cls.getDeclaredFields();
        
        for (Field field : fields) {
            String fieldName = field.getName();
            Class<?> fieldType = field.getType();
            
            // 2. 按JavaBean规范构造Setter方法名:set + 首字母大写的字段名
            String setterName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            // 3. 构造Getter方法名:布尔类型用isXxx,其他用getXxx
            String getterName;
            if (fieldType == boolean.class || fieldType == Boolean.class) {
                getterName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            } else {
                getterName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            }
            
            try {
                // 调用Setter方法给字段赋值
                Method setterMethod = cls.getMethod(setterName, fieldType);
                // 根据字段类型生成测试值,实际场景可替换为你需要的逻辑
                Object value;
                if (fieldType == String.class) {
                    value = "Test_" + fieldName;
                } else if (fieldType == int.class || fieldType == Integer.class) {
                    value = 99;
                } else {
                    value = null;
                }
                setterMethod.invoke(clsInstance, value);
                System.out.println("✅ 调用Setter方法:" + setterName + ",赋值为:" + value);
                
                // 调用Getter方法获取字段值
                Method getterMethod = cls.getMethod(getterName);
                Object result = getterMethod.invoke(clsInstance);
                System.out.println("✅ 调用Getter方法:" + getterName + ",获取的值为:" + result + "\n");
                
            } catch (NoSuchMethodException e) {
                // 处理字段无对应Getter/Setter的情况
                System.err.println("❌ 字段" + fieldName + "不存在对应的" + (e.getMessage().contains(setterName) ? "Setter" : "Getter") + "方法");
            }
        }
    }
}

关键逻辑说明

  • 获取字段:用getDeclaredFields()获取类的所有字段(包括私有),如果只需要公共字段可改用getFields()。
  • 方法名构造:严格遵循JavaBean规范拼接Getter/Setter方法名,确保能匹配到目标方法。
  • 方法调用:通过getMethod()获取方法实例,再用invoke()执行方法,传入实例对象和参数(Setter需要传值,Getter无需参数)。
  • 异常处理:捕获NoSuchMethodException,避免因字段无对应Getter/Setter导致程序崩溃。

这样不管你加载的是AccountPojo还是GetAccountsPojo,都能动态调用它们的方法,完全不需要硬编码类名或方法名~

内容的提问来源于stack exchange,提问作者rahul kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:00