循环中变量名拦截方法及自定义对象整数读取函数创建问询
嘿,我来帮你搞定这两个问题~
问题1:循环中拦截变量名
在Java里直接在循环里“抓”变量名其实有点绕——因为编译后变量名可能会被JVM优化掉(比如代码混淆后就没了)。不过像你这种命名有规律的类成员变量(比如data0、data1...),最实用的办法是用反射来遍历匹配字段名,既能拿到变量名,又能操作对应的值。
核心思路是:
- 获取目标类的所有字段(用
Class.getDeclaredFields()) - 循环遍历每个字段,判断字段名是否符合你的规则(比如以"data"开头,后面跟着数字)
- 符合规则的话,就能通过
Field.getName()拿到变量名,用Field.get(Object)获取对应的值
问题2:读取IODBTLMNG类中的整数内容的函数实现
针对你定义的IODBTLMNG类,我给你两种实现思路,按需选择就行:
方法1:手动遍历(适合字段固定、数量少的情况)
如果字段不会随便加,直接手动读取每个data字段就好,简单又直观:
import java.util.ArrayList; import java.util.List; public class DataReader { public List<Integer> readIntData(IODBTLMNG wrapper) { List<Integer> dataList = new ArrayList<>(); // 逐个添加data0到data10的值 dataList.add(wrapper.data0); dataList.add(wrapper.data1); dataList.add(wrapper.data2); dataList.add(wrapper.data3); dataList.add(wrapper.data4); dataList.add(wrapper.data5); dataList.add(wrapper.data6); dataList.add(wrapper.data7); dataList.add(wrapper.data8); dataList.add(wrapper.data9); dataList.add(wrapper.data10); return dataList; } }
这种方式性能好、可读性强,不用依赖反射,适合字段固定的场景。
方法2:反射实现(适合字段多、可能扩展的情况)
如果以后可能加data11、data12这类字段,用反射就不用每次改代码,更灵活:
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class DataReader { // 匹配"data+数字"格式的字段名 private static final Pattern DATA_FIELD_PATTERN = Pattern.compile("^data\\d+$"); public List<Integer> readIntData(IODBTLMNG wrapper) { List<Integer> dataList = new ArrayList<>(); Class<?> clazz = wrapper.getClass(); // 获取类的所有声明字段 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // 检查字段名符合规则,且类型是int if (DATA_FIELD_PATTERN.matcher(field.getName()).matches() && field.getType() == int.class) { try { // 如果字段是private的,这步能让我们访问它;你的字段是public,这步可以省略,但加上更通用 field.setAccessible(true); // 获取字段的值并加入列表 int value = field.getInt(wrapper); dataList.add(value); } catch (IllegalAccessException e) { // 这里可以加日志或者异常处理逻辑 e.printStackTrace(); } } } // 额外提醒:反射获取字段的顺序不一定是你定义的顺序,如果需要按data0到data10排序,可以加个排序逻辑 // 比如先把字段名和值存成Map,再按字段名里的数字排序后提取值 return dataList; } }
另外提个小细节:你定义类的时候写的public int data0 = new int();其实没必要——int是基本类型,直接public int data0;就行,默认值是0,不用new int()。
内容的提问来源于stack exchange,提问作者Tarma
相关产品推荐
相关产品推荐

