我有一个想法,使用Dao类(Dao.java):
class Dao <Model extends AbstractModel> {
public String getUrl() {
return Model.class.getAnnotation(MyPath.class).url();
}
}
和这样的模型(Account.java):
@MyPath(url = "blabla")
class Account extends AbstractModel {
...
}
但是问题是在这种情况下如果我运行
@Test
public void testDaoUrl() {
Dao<Account> dao = new Dao<Account>();
dao.getUrl();
}
Model.class似乎是一个AbstractModel而不是Account。是否有任何工作可以从Dao获得MyPath注释(不给它一个Account.class的实例)?
提前感谢任何想法!
PS: MyPath-Annotation:
@Retention(RUNTIME)
@Target(TYPE)
@interface MyPath {
public String url();
}
是的,有另一种解决方案,但它比将Class
参数传递给Dao
构造函数更难看,并且更容易出错。
class Dao<Model extends AbstractModel> {
private final Class<?> typeArgument;
public Dao() {
Type superclass = getClass().getGenericSuperclass();
ParameterizedType parameterized = (ParameterizedType) superclass;
// with nested generic types, this becomes a little more complicated
typeArgument = (Class<?>) parameterized.getActualTypeArguments()[0];
}
public String getUrl() {
return typeArgument.getAnnotation(MyPath.class).url();
}
}
和so一样使用
new Dao<Account>(){}.getUrl()
因此,当创建一个Dao
实例时,您实际上创建了一个Dao
子类实例。这样,实例是Dao
的参数化子类型,即。就像
class AnonymousDao extends Dao<Account> {}
,然后可以提取参数化类型并使用