аннотация невидима? - PullRequest
       12

аннотация невидима?

17 голосов
/ 11 сентября 2010

Это озадачивает меня.У меня есть класс с пользовательской аннотацией, и я не могу проверить наличие аннотации.Что я здесь не так делаю?Если я запускаю MyOperationTest (см. Ниже), я получаю в результате:

implements Library.Operation: true
has @Library.Marker: false
Tada!

Library.java:

package com.example.gotchas;

public class Library {
    private Library() {}

    public @interface Marker {}

    public interface Operation {
        public void execute(); 
    }
}

MyOperation.java:

package com.example.gotchas;

@Library.Marker
public class MyOperation implements Library.Operation {
    @Override public void execute() {
        System.out.println("Tada!");
    }
}

MyOperationTest.java:

package com.example.gotchas;

public class MyOperationTest {
    static public void main(String[] args)
    {
        try {
            Class<?> cl = Class.forName("com.example.gotchas.MyOperation");
            boolean implementsLibraryOperation =
                Library.Operation.class.isAssignableFrom(cl);
            boolean hasLibraryMarker =
                cl.isAnnotationPresent(Library.Marker.class);
            System.out.println("implements Library.Operation: "
                    +implementsLibraryOperation);
            System.out.println("has @Library.Marker: "+hasLibraryMarker);
            if (implementsLibraryOperation)
            {
                Class<? extends Library.Operation> opClass = 
                    cl.asSubclass(Library.Operation.class); 
                Library.Operation op = opClass.newInstance();
                op.execute();
            }
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (InstantiationException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

30 голосов
/ 11 сентября 2010

Вы должны определить @Retention для аннотации:

@Retention(RetentionPolicy.RUNTIME)
public @interface Marker {}

В противном случае аннотация не сохраняется во время выполнения.

(Вы также можете добавить явное @Target(ElementType.TYPE), если хотите ограничить использование аннотации только для классов)

Как примечание - не принято определять аннотации как внутренние классы.

2 голосов
/ 11 сентября 2010

По умолчанию политика хранения аннотаций - CLASS, что не делает вашу аннотацию доступной для отражения.Вы должны указать это при объявлении аннотации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...