Я шукав спосіб зробити це самостійно, не додаючи додаткової залежності до класового шляху. Після деякого дослідження я виявив , що це можливо , до тих пір , поки у вас є загальний супертіп. Для мене це було нормально, коли я працював з DAO шаром із загальним супертипом шару. Якщо це відповідає вашому сценарію, то це найменший підхід IMHO.
У більшості випадків використання дженериків, з якими я стикався, є якийсь загальний супертип, наприклад, List<T>
для ArrayList<T>
або GenericDAO<T>
дляDAO<T>
тощо
Чисте рішення Java
У статті Доступ до загальних типів під час виконання на Java пояснює, як це можна зробити за допомогою чистої Java.
@SuppressWarnings("unchecked")
public GenericJpaDao() {
this.entityBeanType = ((Class) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0]);
}
Весняне рішення
У моєму проекті було використано Spring, що ще краще, оскільки Spring має зручний метод корисного пошуку типу. Це найкращий підхід для мене, оскільки він виглядає найбіднішим. Я думаю, якщо ви не використовували Spring, ви можете написати власний корисний метод.
import org.springframework.core.GenericTypeResolver;
public abstract class AbstractHibernateDao<T extends DomainObject> implements DataAccessObject<T>
{
@Autowired
private SessionFactory sessionFactory;
private final Class<T> genericType;
private final String RECORD_COUNT_HQL;
private final String FIND_ALL_HQL;
@SuppressWarnings("unchecked")
public AbstractHibernateDao()
{
this.genericType = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), AbstractHibernateDao.class);
this.RECORD_COUNT_HQL = "select count(*) from " + this.genericType.getName();
this.FIND_ALL_HQL = "from " + this.genericType.getName() + " t ";
}