2010-01-14 8 views
0

Я отлаживаю приложение с помощью OSGi, я ужасно узнаю, что если класс Annotation отсутствует, загрузчик классов будет опускать эту аннотацию, если я вызову метод.getAnnotations(), исключение, но ничего не возвращать.Почему JVM опускает аннотацию

Я не понимаю, но я хочу знать, есть ли способ сделать JVM бросить исключение. есть ли возможность запуска JVM?

@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Before 
public @interface Secured { 
    /** Priority **/ public int order() default 0; 
    /** Mapping **/ public String value() default "profile/validate"; 
    /** Required **/ public boolean required() default true; 
    public String role() default "L1"; 
} 

Спасибо.

+0

ДА, я использую Феликс, теперь я не уверен, что это феликс или проблема JVM. @Target ({ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) @Before общественного @interface Обеспеченные { \t/** Приоритет **/ \t общественного порядка INT() по умолчанию 0; \t/** Отображение **/ \t public String value() default "profile/validate"; \t/** Обязательно **/ \t public boolean required() default true; \t \t public String role() default "L1"; } – Brodie

+0

покажите нам, как вы вызываете getAnnotation, и метод вызывает его. – Bozho

+0

1, Используйте загрузчик классов класса felix, класс Class, Класс clazz = app.getClassLoader(). LoadClass (name); 2, Iterate mathods, for (Метод метода: clazz.getDeclaredMethods()) {...} 3, для каждого метода, вызов, для (запись аннотацииRefAnno: method.getAnnotations()) {...}, метод Defination является: @Entry (значение = "SayHi") @Secured (роль = "L1") общественного недействительными SayHi (Событие е) { \t logger.debug ("SayHi"); \t e.setForward ("sample1/sayHi"); } Если защищенный класс аннотации не импортируется пакетом, метод.getAnnotations() возвращает только одну аннотацию, @Entry. Я использую jdk1.6.17, felix 2.0.1, fedora 12 – Brodie

ответ

3

Ваша аннотация сохраняется во время выполнения? что это есть @Retetntion annotation набора для RUNTIME:

@Retention(RUNTIME) 
public @interface YourAnnotation 
2

Каждой аннотации имеет задержку, определенную для него. Сохранение в основном означает, в каких контекстах JVM сохраняет аннотацию. Различные значения можно увидеть here. По умолчанию используется политика хранения CLASS, что означает, что аннотации находятся в файлах .class, но не используются JVM. То, что вы хотите, это RUNTIME, смысл которого ясен. Кроме того, существует политика SOURCE, для аннотаций, релевантных только во время компиляции.

Чтобы установить политику хранения, вы должны аннотировать аннотацию (мета-мета, кто?), Используя @Retention, о котором вы можете узнать больше о here.

Java annotation tutorial имеет немного больше информации об этом.

Смежные вопросы