У меня есть класс CollectionCriterion, определенный следующим образом:
public class CollectionCriterion<E>
...
//this is a standard JPA path expression to a field (for instance field1.field2.field3
private String pathExpression;
//this is the entity class
private Class<?> entityClass
...
public void validateField() throws IllegalStateException {
...
//here I retrieve the field corresponding to the path expression
//for instance I retrieve the field country corresponding to the
//path "person.address.country"
Field field = JpaUtils.navigateTo(entityClass, pathExpression);
//here I have to check that the retrieved field is a Collection
//of elements of type E (Collection<E>)
if(!Collection.class.isAssignableFrom(field.getType())) {
throw new IllegalArgumentException(...);
}
else {
//if it's a collection check if it contains only
//instances of E
}
...
}
}
Учитывая следующий класс сущности:
@Entity
public class A {
...
private Collection<String> collection;
...
}
Я могу получить java.lang.String
аргумент типа из поля collection
используя java отражение:
Field field = A.class.getDeclaredField("collection");
ParameterizedType fieldType = (ParameterizedType) field.getGenericType();
Class<?> fieldTypeParameter = (Class<?>) fieldType.getActualTypeArguments()[0]; //here i get java.lang.String class.
Как я могу получить параметр типа E
из CollectionCriterion<E>
, чтобы сравнить его с параметром типа поля?
Мне известно о стирании типа ввремя выполнения ( здесь из stackoverflow ), но я нашел следующие инструменты, которые могут извлекать параметры универсального типа: TypeToken , Typetools и Classmate .И я не хочу, чтобы клиент передавал Class<E>
в качестве аргумента конструктора CollectionCriterion<E>
.
Спасибо за ваше время.