为了账号安全,请及时绑定邮箱和手机立即绑定

如何调用位于另一个实例内部的实例的 getter 方法

如何调用位于另一个实例内部的实例的 getter 方法

哆啦的时光机 2022-07-20 10:29:10
我有一些像下面这样的课程:@Getter@Setterclass Person{    @JsonProperty("cInfo")    private ContactInformation contactInfo;    private String name;    private String position;}@Getter@Setterclass ContactInformation{    @JsonProperty("pAddress")    private Address address;}@Getter@Setterclass Address{    private String street;    private String district;}我要做的是为 Person 对象编写一个 Utils 方法,该方法采用一个参数,即 attributeName 作为 String 并返回该属性的 getter 值。前任:attributeName = name -> return person.getName() attributeName = position -> return person.getPosition() attributeName = cInfo.pAddress.street -> return person.getContactInfo().getAddress().getStreet() attributeName = cInfo.pAddress.district -> return person.getContactInfo().getAddress().getDistrict()下面是我所做的:我遍历 Person 对象中的所有字段并检查 attributeName 是否等于 JsonProperty 的名称或字段的名称,然后我将返回这个 getter。Object result;Field[] fields = Person.class.getDeclaredFields();for (Field field : fields) {    JsonProperty jsonProperty = field.getDeclaredAnnotation(JsonProperty.class);    if (jsonProperty != null && jsonProperty.value().equals(attributeName)) {        result = Person.class.getMethod("get" + capitalize(field.getName())).invoke(person);    } else {        if (field.getName().equals(attributeName)) {            result = person.class.getMethod("get" + capitalize(field.getName()))                    .invoke(person);        }    }}这仅适用于直接位于 Person 类中的字段,例如:姓名、职位。使用contactInfo 或address 中的字段,我仍然被困在那里。谁能在这里给我一些提示我该怎么做?
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

因为路径喜欢a.b.c与不同的对象相关。所以你需要。按点拆分并为每个令牌调用获取并将获得的结果用于下一个令牌


更新:类似:


private static Object invkGen(Object passedObj, String attributeName) throws Exception {

    final String[] split = attributeName.split("\\.");

    Object result = passedObj;

    for (String s : split) {

        if (result == null) {

            break;

        }

        result = invk(result, s);

    }

    return result;

}


private static Object invk(Object passedObj, String attributeName) throws Exception {

    Object result = null;

    final Field[] fields = passedObj.getClass().getDeclaredFields();


    for (Field field : fields) {

        JsonProperty jsonProperty = field.getDeclaredAnnotation(JsonProperty.class);

        if (jsonProperty != null && jsonProperty.value().equals(attributeName)) {

            result = Person.class.getMethod("get" + capitalize(field.getName())).invoke(passedObj);

        } else {

            if (field.getName().equals(attributeName)) {

                result = passedObj.getClass().getMethod("get" + capitalize(field.getName()))

                    .invoke(passedObj);

            }

        }

    }

    return result;

}


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信