我无法理解如何调用通用实体服务。下面的代码有效,但我需要在每个bean上维护getEntityClass()
,我认为这是完全多余的。
public abstract class BaseEntityBean<T extends BaseEntity> extends BaseBean {
protected void loadEntity(Class<T> entityClass, Long entityId) { // entityClass same as T
T entity=genericEntityService.getEntity(entityClass, entityId);
}
不要更改genericEntityService.getEntity(Class, Long)
的签名。
我想将loadEntity
的签名更改为loadEntity(Long entityId)
。
如何在genericEntityService.getEntity(Class, Long)
内拨打loadEntity(Long)
来推断T
中的实体类?
如果问题不清楚,请按照以下步骤进行:
public abstract class BaseEntityBean<T extends BaseEntity> extends BaseBean {
protected void loadEntity(Long entityId) {
T entity=genericEntityService.getEntity(T, entityId); // pseudo code
}
当前解决方案
protected void loadEntity(Long entityId) {
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
@SuppressWarnings("unchecked")
Class<T> clazz = (Class<T>) (superclass).getActualTypeArguments()[0];
T entity=genericEntityService.getEntity(clazz, entityId);
}
我对此感到高兴,因为它让我感到高兴。在路上,我将使实体服务类型友好,一切都应该很好地落实到位。
答案 0 :(得分:0)
可以选择使用反射来完成此操作。 正如一些人所指出的那样,这会增加一些开销,所以明智地使用它。
protected final Class<T> getEntityClass() {
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
Class<T> clazz = (Class<T>) (superclass).getActualTypeArguments()[0];
return clazz;
}
答案 1 :(得分:0)
使用TypeTools:
// From within the BaseEntityBean impl
Class<?> t = TypeResolver.resolveRawArgument(BaseEntityBean.class, getClass());
使用TypeTools和getClass().getGenericSuperclass
方法之间的区别在于TypeTools将为您遍历完整的类型层次结构,即使它在层次结构中有多个层,在这种情况下也会完全解析T的值getClass().getGenericSuperclass
失败了。有关更好的主意,请参阅Generic DAO示例。