【发布时间】:2012-01-18 18:04:30
【问题描述】:
我有这样的事情:
@Entity
public class CallCardAttribute implements Serializable, IEntity {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String type;;
@Column(nullable = false)
@ManyToOne(optional = false)
private Validator validator;
public CallCardAttribute() {}
...
该类表示 CallCard 的单个属性。由于它们可能有很多并且任何一个的数量都可能不同,因此我将属性存储为Map<Attribute, String>。为了将其保留在一张表中,所有值都将转换为字符串,而不管应用程序本身的 Java 类型如何。
但是从数据库加载它们时,我需要将它们转换为正确的类型。所以我将它作为type 参数存储在Attribute 类中作为类名字符串。
我发现我可以使用反射来获取字符串指定的类的实例,然后用值填充它。
就像在这个 sn-p 中:
Integer i = 17;
String iVal = i.toString();
String iType = i.getClass().getName();
Object reVal = Class.forName(iType).newInstance();
但我需要将 reVal 转换为正确的类型,可以是 String/Calendar/Integer/Double 中的任何一个...
这可以吗?如果有,怎么做?
【问题讨论】:
-
在您的 sn-p 中,“reVal”是 java.lang.Class 类型。如果类型不兼容,您将如何将 java.lang.Class 中的“reVal”转换为 java.lang.String?这对我来说似乎是一个无效的问题,你能澄清一下吗?
-
“只放在一张桌子上”,为什么?
-
反射应该谨慎使用,它的使用对性能有不好的影响
-
已编辑并希望修复。至于一张桌子的东西 - 它是这样建模的,我无法改变它。除此之外,如果将值存储为不同的类型,JPA 将如何映射它?
-
它将根据您在实体(如果您使用 OneToMany)或您的 Embeddable(如果您使用 ElementCollection)中提供的映射进行映射。
标签: java reflection