繁体   English   中英

Spring如何在运行时获取有关“强类型集合”的泛型类型信息?

[英]How can Spring get generic type information during runtime regarding “Strongly-typed collection”?

我在Spring 3.0文档中阅读以下内容:

强类型集合(仅Java 5+)

在Java 5和更高版本中,可以使用强类型的集合(使用泛型类型)。 也就是说,可以声明一个Collection类型,使其仅包含String元素(例如)。 如果您使用Spring将强类型的Collection依赖注入到Bean中,则可以利用Spring的类型转换支持,以便在将强类型的Collection实例的元素添加到其中之前将其转换为适当的类型。集合。

public class Foo {

  private Map<String, Float> accounts;

  public void setAccounts(Map<String, Float> accounts) {
      this.accounts = accounts;
  }
}

<beans>
  <bean id="foo" class="x.y.Foo">
      <property name="accounts">
          <map>
              <entry key="one" value="9.99"/>
              <entry key="two" value="2.75"/>
              <entry key="six" value="3.99"/>
          </map>
      </property>
  </bean>
</beans>

当准备注入foo bean的accounts属性时,可以通过反射获得有关强类型Map的元素类型的泛型信息。 因此,Spring的类型转换基础结构将各种值元素识别为Float类型,并将字符串值9.99、2.75和3.99转换为实际的Float类型。

这怎么可能? 据我所知,泛型类型信息在编译过程中会被删除。

之所以可行,是因为对象的类型被删除,而字段则被删除。 看看java类文件中的泛型类型存储在哪里? 有关其工作原理的详细说明。

本质上,(惊奇)1.5中引入了Field.getGenericType()方法, Field.getGenericType()方法始终返回可靠的字段通用类型。 所以Spring 能够读取accounts通用类型( <String, Float> )通过纯反射。

注意,例如在使用了相同的机制。 这是完全有效且有效的:

@Entity
public class Customer {

    @OneToMany
    private Set<Order> orders;

}

@Entity
public class Order {

    @Id
    private Integer id;

}

没有此Java 5功能,JPA提供者将无法弄清orders 一对多关系的第二面是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM