Java annotation processor, annotation types with annotations

Joba

I am using a annotation processor to process annotations of method parameters.

public void multiply(@IntArg int a){
    ...
}

The annotations types used for the parameters have an annotation, @Argument

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.PARAMETER})
@Argument
public @interface IntArg {
}

Now, when my annotation processor is running, I want to check if a parameter annotation (@IntArg) has the @Argument annotation. I do this by executing the following code.

VariableElement param = ... //The parameter
for (AnnotationMirror mirror : param.getAnnotationMirrors()) {
    Argument arg = mirror.getAnnotationType().getAnnotation(Argument.class);
    if(arg != null) {//Args is always null
        ...
    }
}

For some reason arg is always null. Is there a reason why the annotation is not returned?

Radiodef

I think what you need is this:

VariableElement param = ...;
for (AnnotationMirror mirror : param.getAnnotationMirrors()) {
    DeclaredType t = mirror.getAnnotationType();
    // (Filter out ErrorType: see my addendum.)
    if (t.getKind() == TypeKind.DECLARED) {
        Element e = t.asElement();
        // (This should always be true.)
        if (e.getKind() == ElementKind.ANNOTATION_TYPE) {
            Argument a = e.getAnnotation(Argument.class);
            // ...
        }
    }
}

From DeclaredType and TypeElement:

While a TypeElement represents a class or interface element, a DeclaredType represents a class or interface type, the latter being a use (or invocation) of the former.

So if you want to examine a declaration somehow, you want the element rather than the type.

Note that I also could have casted e to a TypeElement in the above snippet; there was just no particular reason to.


Quick addendum regarding my edit: I think it's probably correct to check the TypeKind here because it's possible for getAnnotationType() to return an ErrorType. This could happen if I did something like this:

void m(@IntArg @TypeWhichDoesntExist int arg0) {
}

Where TypeWhichDoesntExist is a type which doesn't exist, for example because it's not imported, because it's an @interface which is generated by another annotation processor or because it's altogether a non-existent type. (Annotation processors may be invoked with code that doesn't compile.)

I don't think this would have caused a problem with the way my example was written before, but I think it's worthwhile to point out that this could happen.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Identify stability of types in Java annotation processor

how to find annotation processor for java and spring's annotations

Nullable types in kotlin annotation processor

Java Annotation Processor getEnclosingElement() method

Java Annotation processor for remote JAR

How to write a Java annotation processor?

Unable to run java annotation processor

Getting type of field without any annotations in annotation processor

How to use Android Annotations and its annotation processor with jack?

How to get class that annotation applied to in Java Annotation Processor?

Annotation processor doesn't run in plain Java

Annotation Processor appears to break Java generics

Java annotation processor not generating file in generated sources

How to handle generics inside a Java "annotation processor"?

Java annotation processor- fields of field

Get type of array in Java annotation processor

Forward compatible Java 6 annotation processor and SupportedSourceVersion

Discover the class of a methodinvocation in the Annotation Processor for java

Java Annotation processor check for full rebuild

Java - Annotation processor - method process not called

process java types without annotation

How to get proper kotlin types from RoundEnvironment for custom Annotation processor?

Kotlin Annotation processor how to get constructor argument types?

Is it possible for an annotation processor to access types generated in a previous round?

Is it possible to create a custom annotation with a group of annotations in Java?

Java custom annotations takes another annotation

Java custom Annotation aggregate multiple annotations

Java annotation that expands/resolves to many annotations?

Java annotation processing edit file created by annotation processer with other annotation processor

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    pump.io port in URL

  3. 3

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  4. 4

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  5. 5

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  8. 8

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

  9. 9

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  10. 10

    How to remove the extra space from right in a webview?

  11. 11

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  12. 12

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  13. 13

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

  14. 14

    java.lang.NullPointerException: Cannot read the array length because "<local3>" is null

  15. 15

    How to use merge windows unallocated space into Ubuntu using GParted?

  16. 16

    flutter: dropdown item programmatically unselect problem

  17. 17

    Pandas - check if dataframe has negative value in any column

  18. 18

    Nuget add packages gives access denied errors

  19. 19

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  20. 20

    Generate random UUIDv4 with Elm

  21. 21

    Client secret not provided in request error with Keycloak

HotTag

Archive