繁体   English   中英

阅读通用类Java的注释

[英]Read annotation of generic class 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注释:

@Retention(RUNTIME)
@Target(TYPE)
@interface MyPath {
    public String url();
}

是的,还有另一种解决方案,但是它比将Class参数传递给Dao构造函数更难看,而且更容易出错。

这种技巧被称为类型令牌 我已经看到它主要用于反序列化库(例如Gson或Jackson的JSON)。

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();
    }
}

像这样使用

new Dao<Account>(){}.getUrl()

因此,在创建Dao实例时,实际上是在创建Dao子类实例。 这样,实例是Dao的参数化子类型。 就像是

class AnonymousDao extends Dao<Account> {}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM