如何将C#泛型对象属性获取方法转换为Java实现?
实现C#泛型属性获取方法的Java等价实现
问题背景
我有一段用于从泛型对象中获取属性的C#方法,想在Java中实现相同功能:
public string GetProperty<T>(T obj) { var s = string.Empty; var t = obj.GetType(); foreach (var pi in t.GetProperties()) s += " " + pi.Name + ":" + pi.GetValue(obj, null); return s; }
给定Java的Emp类:
public class Emp { int Id; String Msisdn; public int getId() { return Id; } public void setId(int id) { Id = id; } public String getMsisdn() { return Msisdn; } public void setMsisdn(String msisdn) { Msisdn = msisdn; } }
期望调用方式:
Emp data = new Emp(); data.setId(1); data.setMsisdn("1404850126"); String s = ConvertString(data);
期望返回结果:
Id:1 Msisdn:1404850126
Java实现方案
在Java中可通过反射机制实现类似功能,以下提供两种匹配需求的实现方式:
方式1:直接读取对象字段(适配现有Emp类结构)
直接通过反射获取类的字段并读取值,适合字段非私有或可设置访问权限的场景:
import java.lang.reflect.Field; public class PropertyUtils { public static <T> String ConvertString(T obj) { StringBuilder sb = new StringBuilder(); Class<?> clazz = obj.getClass(); // 获取类中所有声明的字段 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { try { // 允许访问非public字段 field.setAccessible(true); Object value = field.get(obj); sb.append(field.getName()).append(":").append(value).append(" "); } catch (IllegalAccessException e) { e.printStackTrace(); } } // 移除末尾多余空格 if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } }
方式2:通过JavaBean getter方法映射字段(符合规范)
如果类遵循JavaBean规范(字段私有、getter方法命名为getXxx),可通过解析getter方法名反向获取字段名:
import java.lang.reflect.Method; public class PropertyUtils { public static <T> String ConvertString(T obj) { StringBuilder sb = new StringBuilder(); Class<?> clazz = obj.getClass(); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { // 筛选无参数的getter方法 if (method.getName().startsWith("get") && method.getParameterCount() == 0) { try { // 从getter方法名提取字段名:getId -> Id String fieldName = method.getName().substring(3); Object value = method.invoke(obj); sb.append(fieldName).append(":").append(value).append(" "); } catch (Exception e) { e.printStackTrace(); } } } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } }
调用验证
使用给定的Emp实例调用上述任意方法,都会返回期望结果:
Id:1 Msisdn:1404850126
内容的提问来源于stack exchange,提问作者Yeasin Arafat
相关产品推荐
相关产品推荐

