Class de parâmetro genérico

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.

Alguma sugestão? Não sei se fui claro :frowning:

Agradeço desde já.

public Class&lt;T&gt; getPersistentClass() { return persistentClass; }

resolve?

Não resolve, pois o T.getClass não é possível no java 5.

Tentei da seguinte forma:

this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Porém ocorre um java.lang.ClassCastException: java.lang.Class :frowning:

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&lt;T&gt; implements BasicRemote&lt;T&gt;, BasicLocal&lt;T&gt; {

    private final Class&lt;T&gt; persistentClass;

    @PersistenceContext(unitName = "manager")
    private EntityManager em;

    public BusBasicBean(Class&lt;T&gt; 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.