RetentionPolicy CLASS vs. RUNTIME - PullRequest
       10

RetentionPolicy CLASS vs. RUNTIME

43 голосов
/ 12 мая 2011

В чем практическая разница между RetentionPolicy.CLASS и RetentionPolicy.RUNTIME?

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

Ответы [ 3 ]

52 голосов
/ 12 мая 2011

оба могут быть доступны во время выполнения в любом случае.

Это не то, что Javadoc говорит:

RUNTIME: аннотации должны быть записаны в файле класса компилятором и сохранены виртуальной машиной во время выполнения, поэтому они могут быть рефлексивно прочитаны .

CLASS: аннотации должны быть записаны в файле классов компилятором, но не требуется сохранять виртуальной машиной во время выполнения .

На практике я не знаю ни одного варианта использования для CLASS. Было бы полезно, если бы вы хотели читать байт-код программно, а не через API загрузчика классов, но это очень специализированный случай, и я не знаю, почему вы просто не использовали бы RUNTIME.

Как ни странно, CLASS является поведением по умолчанию.

2 голосов

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

False для базовых встроенных интерфейсов аннотаций, таких как getAnnotations. E.g.:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}

@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}

public static void main(String[] args) {
    @RetentionClass
    class C {}
    assert C.class.getAnnotations().length == 0;

    @RetentionRuntime
    class D {}
    assert D.class.getAnnotations().length == 1;
}

, поэтому единственный способ наблюдать аннотацию RetentionPolicy.CLASS - использовать синтаксический анализатор байт-кода.

Другое отличие состоит в том, что аннотированный класс Retention.CLASS получает атрибут класса RuntimeInvisible , а аннотации Retention.RUNTIME получают атрибут класса RuntimeVisible . Это можно наблюдать с javap.

Примеры на GitHub , с которыми вы можете играть.

0 голосов
/ 05 марта 2018

Аннотации с политикой хранения CLASS и RUNTIME доступны из байтового кода класса. Нам нужно использовать библиотеку манипулирования байтовым кодом (например, ASM) для доступа к аннотациям, доступным в байтовом коде.

Простой пример здесь - http://bethecoder.com/applications/tutorials/java/annotations/class-and-runtime-retention-policy.html

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