读取泛型类Java的注释



我有一个想法,使用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构造函数更难看,并且更容易出错。

这个技巧被称为类型标记。我看到它主要用于反序列化库(如JSON的Gson或Jackson)。
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> {}

,然后可以提取参数化类型并使用

最新更新