В чем разница между Groovy's AnnotationNode и Java-аннотацией? - PullRequest
0 голосов
/ 19 октября 2010

Я написал библиотеку, в которой я делаю некоторый самоанализ для полей Java, чтобы иметь их список аннотаций (и более конкретно, чтобы увидеть, есть ли у них одна или несколько конкретных аннотаций (например, скажем, @Id, @Child,@Parent). Вот пример типа кода, который я использую:

    @Override
    public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
        return mapped.getAnnotation(annotationClass);
    }

Где mapped - это Java Поле (и, как следствие, имеет getAnnotation(Annotation) метод). Я хочу перенести этот метод в Groovy.

Я уже понял, что, используя Groovy, я должен заменить свои поля (или свойства компонента) на MetaProperties. Однако я сталкиваюсь с проблемой, связанной с использованием этих аннотаций, так как кажется, что groovy обрабатывает их совершенно иначе, чем в Java.

Итак, можно ли рассмотреть путь перехода от аннотаций Java к GroovyAnnotationNode, или мне придется создать абстракцию над этими понятиями?

1 Ответ

0 голосов
/ 20 октября 2010

Я не уверен насчет AnnotationNode. Исходя из пакета, в котором он находится, я бы предположил, что он связан с AST Transformations .

В любом случае ваш код должен работать в Groovy так же, как Java. Я использую JPA в Groovy и получил доступ к аннотациям через отражение Java. Если у вас возникла конкретная проблема, предоставьте более подробную информацию.

Вы, кажется, смущены "полями" и "мета-свойствами". Вы не изменяете свои поля в metaProperties. Ваши поля становятся мета-свойствами. Другими словами, поле в классе Groovy по умолчанию является свойством bean-компонента (вы получаете getter / setter бесплатно). Вы можете получить динамический доступ к свойствам с помощью Groovy, но они все еще являются полями в байт-коде.

Ниже приведен небольшой скрипт Groovy, демонстрирующий доступ к свойству bean-компонента и получение его аннотации.

import java.lang.reflect.*

class Person {

  @Deprecated
  String name

}

def me = new Person(name:'dave')

assert me.name == 'dave'
assert me.'name' == 'dave'
assert me.getName() == 'dave'

assert Person.class.getDeclaredField('name') instanceof Field
assert Person.class.getDeclaredField('name').getAnnotations()
assert Person.class.getDeclaredField('name').getAnnotation(Deprecated.class) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...