【问题标题】:Create class instance from class name从类名创建类实例
【发布时间】: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


【解决方案1】:

使用 instanceof 来确定要转换为: if (reVal instanceof String) result = (String) eval; ... 您需要将每种类型的单独变量强制转换为

【讨论】:

    【解决方案2】:

    如果您不想在属性集合上使用 @OneToMany,您可以使用 JPA 2.0 ElementCollection。

    http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

    您仍然会在单独的表格中找到属性。

    【讨论】:

    • 那么,我可以使用 JPA 映射类似 Map 的东西吗?其中 T 是字符串/日历/数字中的任何一个?
    • 是的,例如参见 hwellmann.blogspot.com/2010/07/jpa-20-mapping-map.html 或 google "jpa map elementcollection onetomany" ...但如果您只能使用一张桌子,它对您不起作用。编辑:并且 T 不能只是任何对象,它必须是您使用 Embeddable 或 Entity 注释的类型。
    • 也许你可以序列化/反序列化为一个 blob 并在反序列化后使用 instanceof 进行转换。但这也需要更改架构(而且通常会非常讨厌)。 stackoverflow.com/questions/2121860/…
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2011-04-14
    • 2011-11-02
    • 2014-05-31
    • 2015-07-18
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多