Действительно ли возможно инстанцировать Аннотации Java, учитывая Класс <? расширяет Аннотацию>?

У меня есть a Class<? extends Annotation> и попробованный вызов newInstance() но Java вопил на меня по очевидной причине, что я не могу инстанцировать интерфейса. Но я знаю, что платформы как EasyMock совершенно способны к инстанцированию интерфейсов. Что это взяло бы для получения абсолютно немого Annotation экземпляр из моего Class?

5
задан Steve 7 May 2010 в 04:53
поделиться

3 ответа

Mock-фреймворки не инстанцируют интерфейсы, они создают классы, которые реализуют их на лету во время выполнения. Возможно, вы найдете этот javadoc познавательным для того, что вы хотите сделать!

7
ответ дан 18 December 2019 в 10:42
поделиться

Спасибо Аффе за указание правильного направления - я бы прокомментировал его ответ, но тогда я не смог бы отформатировать решение: {{ 1}}

Annotation annotation = (Annotation) Proxy.newProxyInstance(
  clazz.getClassLoader(),
  new Class[] { Annotation.class },
  new InvocationHandler() {
    @Override public Object invoke(Object proxy, Method method, Object[] args) {
      return clazz; // only getClass() or annotationType() should be called.
    }
  });
работает как шарм.
7
ответ дан 18 December 2019 в 10:42
поделиться

Вы не можете создать экземпляр не полностью указанного класса.

Для иллюстрации, вызов newInstance () для класса типа Class определенно создаст объект, но вызов newInstance () для class типа Class заставит компилятор задуматься, какой класс из всего множества возможностей он должен построить.

Просто потому, что вы немного сузили поле, указав, что вместо ? вам нужна ? , расширяющая Аннотация , не означает вы фактически назвали конкретный класс для создания. ? extends Annotation просто означает «некоторый класс, который расширяет Annotation » Без указания точного класса ClassLoader не может определить, какой конструктор вызвать, поскольку нет ограничений на количество классов, которые могут расширяться Аннотация .

EasyMock не создает экземпляры интерфейсов. Я не знаком с фреймворком, но он, вероятно, создает экземпляры java.lang.Object (-ов), которые расширяют желаемый интерфейс, или он создает экземпляр какого-то «негласного» класса фреймворка, который был сгенерирован с предложением «реализует интерфейс». в определении класса. У интерфейсов нет конструктора по умолчанию.

2
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: