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

我有一些像下面这样的课程:


@Getter

@Setter

class Person{

    @JsonProperty("cInfo")

    private ContactInformation contactInfo;

    private String name;

    private String position;

}


@Getter

@Setter

class ContactInformation{

    @JsonProperty("pAddress")

    private Address address;

}


@Getter

@Setter

class 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 中的字段,我仍然被困在那里。谁能在这里给我一些提示我该怎么做?


哆啦的时光机
浏览 93回答 1
1回答

慕尼黑8549860

因为路径喜欢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;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java