Создать экземпляр класса из имени класса - PullRequest
2 голосов
/ 18 января 2012

У меня есть что-то вроде этого:

@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 как строку имени класса.

Я понял, что мог бы использовать отражение, чтобы получить экземпляр класса, указанного в строке, и затем заполнить его значением.

Как в этом фрагменте:

Integer i = 17;
String iVal = i.toString();
String iType = i.getClass().getName();

Object reVal = Class.forName(iType).newInstance();

Но мне нужно привести reVal к правильному типу, который может быть любым из String / Calendar / Integer / Double ...

Можно ли это сделать? И если да, то как?

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Если вы не хотите использовать @OneToMany в коллекции атрибутов, вы можете использовать JPA 2.0 ElementCollection.

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

Вы по-прежнему будете иметь атрибуты в отдельной таблице.

0 голосов
/ 18 января 2012

используйте instanceof, чтобы определить, к кому обратиться: if (reVal instanceof String) result = (String) eval; ... Вам понадобится отдельная переменная каждого типа для приведения к

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...