Boa tarde!
Venho pedir ajuda novamente para resolver este problema:
Preciso testar se o tipo genérico de uma determinado lista corresponde a uma determinada classe que possui uma anotação chamada @Entity.
Sei que amanhã, possívelmente, este problema seja resolvido mais facilmente, pq agora a mente está muito saturada, mas por via das dúvidas resolvi pedir socorro a vocês para ver se consigo sair deste prego o quanto antes. Bom… seque a implementação do que desejo:
public class CollectionTypeSpecification implements PropertySpecification {
@Override
public boolean isSatisfiedBy(Object object) {
boolean ret = false;
if (object instanceof Iterable<?>){
Type t = object.getClass().getGenericSuperclass();
if (t != null){
ParameterizedType p = (ParameterizedType) t;
Class<?> itemsClass = (Class<?>) p.getActualTypeArguments()[0];
ret = (itemsClass.getAnnotation(Entity.class) != null);
}
}
return ret;
}
// apenas para teste
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
CollectionTypeSpecification c = new CollectionTypeSpecification();
List<Details> details = new ArrayList<Details>();
System.out.println(c.isSatisfiedBy(details));
}
}[/code]
Considerando que Details possui a devida anotação o resultado deveria ser "[b]true[/b]", porém o resultado é:
[code]Exception in thread "main" java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
at br.com.mysoft.dshelper.specifications.CollectionTypeSpecification.isSatisfiedBy(CollectionTypeSpecification.java:22)
at br.com.mysoft.dshelper.specifications.CollectionTypeSpecification.main(CollectionTypeSpecification.java:32)[/code]
Sei que se eu alterar a parte do código do [b]main[/b] pelo código abaixo funcionará, mas não é esta a solução que desejo.
[code] ...
CollectionTypeSpecification c = new CollectionTypeSpecification();
List<Details> details = new ArrayList<Details>(){
};
System.out.println(c.isSatisfiedBy(details));
...
Alguma sugestão?