Olá pessoal, tem como eu obter o class de um parâmetro genérico em um ejb?
Ex.:
[code]@Stateless(name = “test.BasicRemote”)
public class BasicBean implements BasicRemote, BasicLocal {
private Class<T> persistentClass;
@PersistenceContext(unitName = "manager")
private EntityManager em;
public BusBasicBean() {
}
public T find() {
persistentClass = T.getClass();
return (T) em.find(persistentClass, BusUtil.getValueId(arg));
}
}
[/code]
Eu sei que o código acima não funciona quando chamo T.getClass() (uso java 5.0), porém quando faço um context.lookup na interface BasicRemote para acessar o ejb, eu coloco o retorno em um BasicRemote por ex., mas no ejb não consigo de forma alguma obter o class de Pessoa ao qual foi declarado.
T é um tipo, portanto T.getClass() não funciona, pois getClass() é para objetos, e não classes. T.getClass() é algo mais ou menos como String.getClass(), não faz sentido.
T.class faria mais sentido, assim como String.class e Integer.class fazem. Mas infelizmente, os tipos genéricos são perdidos durante a compilação (type erasure), e por isso T.class não compila. Se compilasse, a máquina virtual veria Object.class, o que em 99,9% das vezes não faria sentido.
Tenta fazer assim:
@Stateless(name = "test.BasicRemote")
public class BasicBean<T> implements BasicRemote<T>, BasicLocal<T> {
private final Class<T> persistentClass;
@PersistenceContext(unitName = "manager")
private EntityManager em;
public BusBasicBean(Class<T> persistentClass) {
this.persistentClass = persistentClass;
}
public T find() {
return persistentClass.cast(em.find(persistentClass, BusUtil.getValueId(arg)));
}
}
Essa técnica é mais ou menos como colocar dentro da classe manualmente a informação que o type erasure apagou na compilação. A grande desvantagem está na assinatura do construtor que teve que ser alterada para que o objeto possa determinar na sua criação qual é o seu tipo genérico.