2

在Java中使用属性名称作为字符串来获取属性的强类型值的最佳方法是什么。

例如:一个 Person 类,其年龄字段为整数,例如 21。如果以下语句必须为年龄字段返回整数 21,那么 get 方法的实现应该是什么?[注:21 以整数形式返回]

ObjectUtils.get(person, "age");

示例方法标题

public static <E> E get(Object object, String fieldName);

一种方法是获取字段的类型并显式地进行类型转换。

另一种方法是在BeanUtils类(Apache 公共库)中使用getProperty方法。但是,限制是它只返回字符串,而不是强类型值。

有没有更好的方法或库实用程序可以实现这一目标?

4

2 回答 2

2

以下实现达到了目的。

@SuppressWarnings("unchecked")
public static <E> E get(Object object, String fieldName) {
    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            return (E) field.get(object);
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
        } catch (Exception e) {
            return null;
        }
    }
    return null;
}
于 2013-05-24T11:51:49.933 回答
1

E如上所述使用泛型将无济于事,因为由于类型擦除将在运行时转换E为,您将无法转换为。Object我建议以下...

 public static <E> E get(Object source, String fieldName, Class<E> returnType){
      Object field = ...// get field value via reflection possibly using `ReflectionUtils`
      return returnType.cast(field);
 }

更新...

根据您关于从通过反射获取Class实例的评论。Field我建议上面更简单,更灵活。要在上面拨打电话,您需要执行以下操作:

 MyType type = ObjectUtils.<MyType>get(instance, "field");

然后在该方法中,您需要获取Field对象并从中获取Class对象。在我的解决方案中,电话是

 MyType type = ObjectUtils.get(instance, "field", MyType.class);

调用大致相同,只是MyType在不同的地方,但是代码不再需要检索Class实例,并且调用者可以传递可以将字段强制转换到的任何类,而不是仅获取声明的类型并且可能必须这样做演员表。

于 2013-05-23T10:46:24.630 回答