阅读泛型类Java的注释

伊利亚·阿南耶夫(Ilya Ananyev)

我有一个使用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();
}
Sotirios Delimanolis

是的,还有另一种解决方案,但是它比将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> {}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章