Java通用Getter/Setter实现:能否通过属性参数复用方法?
通用Getter/Setter的实现方案
你想要的“用单个方法处理任意属性存取”的逻辑在Java里是可以实现的,但没法像你示例里那样直接传递属性引用——Java是静态类型语言,没有这种语法。下面给你几种实用的方案:
1. 反射实现通用存取
反射可以让你在运行时动态访问类的字段,从而写出通用的Getter和Setter:
import java.lang.reflect.Field; class SomeClass { int var1; int var2; int var3; // 根据字段名获取值 public Object getAnyVar(String fieldName) throws NoSuchFieldException, IllegalAccessException { Field field = this.getClass().getDeclaredField(fieldName); field.setAccessible(true); // 允许访问非public字段 return field.get(this); } // 根据字段名设置值 public void setAnyVar(String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException { Field field = this.getClass().getDeclaredField(fieldName); field.setAccessible(true); field.set(this, value); } }
注意点:
- 反射会带来一定的性能损耗,且属于运行时检查错误——如果字段名写错,编译期不会报错,只有运行时才会抛出异常
- 需要处理
NoSuchFieldException和IllegalAccessException两种异常
2. 用Map存储动态属性
如果不需要严格的静态类型检查,可以直接用Map来存放所有属性,天然支持通用存取:
import java.util.HashMap; import java.util.Map; class SomeClass { private Map<String, Integer> vars = new HashMap<>(); public Integer getAnyVar(String varName) { return vars.get(varName); } public void setAnyVar(String varName, Integer value) { vars.put(varName, value); } }
优缺点:
- 写法简单,没有反射的复杂性
- 但失去了Java的静态类型安全,没法在编译期确保某个属性存在,且属性类型受限于Map的泛型(要支持多种类型可以用
Map<String, Object>,但类型安全性更差)
3. 用Lombok减少重复代码(最实用的替代方案)
如果只是不想手动编写每个属性的Getter/Setter,推荐用Lombok的@Data注解——它会自动帮你生成所有属性的Getter、Setter,以及toString、equals等常用方法:
import lombok.Data; @Data class SomeClass { int var1; int var2; int var3; }
这种方式不用写通用方法,但能彻底避免重复的Getter/Setter代码,同时保留静态类型安全,编译期就能检查错误,是日常开发中最常用的方案。
内容的提问来源于stack exchange,提问作者spaghetticode
相关产品推荐
相关产品推荐

