【问题标题】:Get the strongly typed property value from object in Java从Java中的对象获取强类型属性值
【发布时间】:2013-05-23 10:19:14
【问题描述】:

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

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

ObjectUtils.get(person, "age");

示例方法头

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

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

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

有没有更好的方法或库实用程序来实现这一点?

【问题讨论】:

  • Java 是强类型语言!
  • 嗨 alpesh,我们不会在任何地方妥协类型。使用反射,可以使用属性名称获取属性的值。只是想知道是否有任何库实用程序或更好的方法来实现这一点?

标签: java object reflection type-conversion


【解决方案1】:

以下实现达到了目的。

@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;
}

【讨论】:

    【解决方案2】:

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

     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);
     }
    

    更新...

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

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

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

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

    调用大致相同,只是 MyType 位于不同的位置,但是代码不再需要检索 Class 实例,并且调用者可以传递可以将该字段转换为的任何类,而不是仅传递获取声明的类型并可能需要进行强制转换。

    【讨论】:

    • returnType是不是多余的,因为fieldName已经对应了object中的一个属性,可以从中扣除returnType?
    • 以上更简单、更灵活,请参阅更新了解 IMO 的原因
    猜你喜欢
    • 2020-10-15
    • 2021-03-18
    • 2019-09-19
    • 2011-01-24
    • 2020-03-17
    • 2016-10-07
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多