阅读通用注释 class Java

Read annotation of generic class Java

我想到了用道class (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 似乎是一个抽象模型而不是一个帐户。 是否有任何解决方法可以从 Dao 获取 MyPath 注释(不给它一个 Account.class 的实例)?

提前感谢任何想法!

PS: MyPath-注解:

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

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

这个技巧被称为type token。我已经看到它主要用于反序列化库(如 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();
    }
}

并像这样使用

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

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

class AnonymousDao extends Dao<Account> {}

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