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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:25:24