在Java中使用属性名称作为字符串获取属性的强类型值的最佳方法是什么。
例如:一个Person类,其中age字段为整数,例如21.如果以下语句必须返回age字段的整数21,那么get方法的实现应该是什么? [注意:21将作为整数返回]
ObjectUtils.get(person, "age");
示例方法标题
public static <E> E get(Object object, String fieldName);
一种方法是获取字段的类型并明确地输入类型。
其他方法是在 BeanUtils 类(Apache commons库)中使用 getProperty 方法。但是,限制是它只返回字符串,而不是强类型值。
是否有更好的方法或库实用程序可用于实现此目的?
答案 0 :(得分: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;
}
答案 1 :(得分: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
实例,调用者可以传递任何可以投射字段的类而不是仅获得声明的类型并且可能必须进行演员表。