如何利用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
相关产品推荐
相关产品推荐

