簡體   English   中英

Groovy的AnnotationNode和Java的注釋之間有什么區別?

[英]What is the difference between Groovy's AnnotationNode and Java's annotation?

我已經編寫了一個庫,其中對Java字段進行了一些自省以獲取其注釋列表(更具體地說,是查看它們是否具有一個或多個特定的注釋(例如@Id @Child@Id @Child@Parent )。是我使用的那種代碼的示例:

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

Java 字段的 mapped位置(因此具有getAnnotation(Annotation)方法)。 我想將此方法移植到Groovy。

我已經了解使用Groovy,我必須用MetaProperties替換我的Fields(或bean屬性)。 但是,考慮使用這些注釋時,我遇到了一個問題,因為Groovy似乎對它們的處理與Java非常不同。

因此,是否可以考慮從Java注釋到Groovy AnnotationNode的遷移路徑,還是我必須在這些概念上創建一個抽象?

我不確定AnnotationNode。 基於它所在的包,我認為它與AST Transformations有關

無論如何,您的代碼應在Groovy中與Java相同。 我在Groovy中使用JPA,並且已經通過Java反射訪問了注釋。 如果您遇到特定問題,請提供更多詳細信息。

您似乎對“字段”與“元屬性”感到困惑。 您無需將字段更改為metaProperties。 您的字段將成為metaProperties。 換句話說,Groovy類上的字段默認情況下是bean屬性(您可以免費獲取getter / setter)。 您可以使用Groovy動態訪問屬性,但是它們仍然是字節碼中Field的屬性。

下面是一個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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM