Как аннотировать блок кода в Java

Можно ли аннотировать блок кода? Например. для цикла или просто фигурные скобки? Если да, то как?

First.java

package An;
import An.ForCycle;

class First {
    public static void main(String[] args) {
        First f = new First();
    }

    public First () {

        @ForCycle
        {   // error: illegal start of type {
            int k;
        }

        @ForCycle
        for (int i = 0; i < 5; i++) {   // similar error (illegal start...)
            System.out.println(i);
        }
    }
}

ForCycle.java

package An;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
public @interface ForCycle {}

Согласно http://www.javacodegeeks.com/2012/11/java-annotations-tutorial-with-custom-annotation.html

@Target — указывает виды элементов программы, к которым применим тип аннотации. Некоторыми возможными значениями являются ТИП, МЕТОД, КОНСТРУКТОР, ПОЛЕ и т. д. Если целевая мета-аннотация отсутствует, то аннотацию можно использовать для любого элемента программы.

Любой программный элемент (наверное) тоже означает блокировку, не так ли? Так почему же я не могу аннотировать блок или для? Что мне не хватает?

Спасибо за помощь


person petrbel    schedule 15.06.2014    source источник
comment
Просто интересно, почему вы хотите аннотировать блок? Разве мы не можем добиться этого с помощью комментариев?   -  person fajarkoe    schedule 16.06.2014
comment
@fajarkoe Я пишу альтернативный препроцессор с автоматическим распараллеливанием, используя ANTLR в качестве анализатора дерева AST. Грамматика Java8 может распознавать аннотации, но, конечно, не комментарии. Я собирался что-то вроде @parallel for (..) {...}   -  person petrbel    schedule 16.06.2014
comment
Кто-нибудь знает о статусе JSR308, который, кажется, хочет делать именно то, что хочет вопрошающий? code.google.com/p/jsr308-langtools/wiki/AnnotationsOnStatements   -  person Andrew Mackenzie    schedule 20.11.2014
comment
Вы нашли здесь альтернативу? Кроме использования аннотации   -  person Vinay Gupta    schedule 28.05.2016


Ответы (3)


Это означает любой элемент программы из уже перечисленных.

В качестве последнего слова по этому вопросу можно просто обратиться к Спецификация языка Java:

Аннотации могут использоваться в качестве модификаторов в любом объявлении, будь то пакет, класс (включая перечисления), интерфейс (включая типы аннотаций), поле, метод, формальный параметр, конструктор или локальная переменная.

Аннотации также могут использоваться для констант перечисления.

person Oliver Charlesworth    schedule 15.06.2014

Нет, вы не можете этого сделать. Собственно, вы уже сами ответили на свой вопрос. Существует близкий список целей, где можно использовать аннотацию: {TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}. Как видите, нет такого понятия, как «блокировка». Почему? Вероятно, потому что аннотация должна быть прикреплена к чему-то названному, например. метод, поле, класс и т. д.

Действительно подумайте о том, как можно использовать аннотацию? Доступ к аннотациям осуществляется с помощью API отражения. Вы можете запросить аннотации определенного метода или поля. Как вы ожидаете запросить аннотацию блока?

И последнее уведомление. Аннотации можно использовать во время выполнения или во время компиляции. Аннотации, доступные во время компиляции, используются компиляторами, IDE и процессорами аннотаций для создания дополнительных предупреждений, ошибок или кода. IntelliJ как хорошо известная IDE с набором функций статического анализа кода поддерживает так называемые «блочные аннотации», которые синтаксически являются обычными встроенными комментариями, но обрабатываются IDE как аннотации, которые могут подавлять некоторые предупреждения.

person AlexR    schedule 15.06.2014

«Любой элемент программы» означает здесь коннотацию «из указанного списка», т.е. «по умолчанию ВСЕ значения», говорится в этом утверждении.

В общем случае это невозможно, потому что только компилятор работает с блоками кода и перемалывает все эти блоки в байт-коды, смешанные сложным образом. Для такой аннотации просто нет возможного использования, кроме рекомендаций по компиляции.

person oleksiyp    schedule 15.06.2014
comment
Для аннотаций на уровне блоков может быть множество применений, таких как транзакции, ведение журналов, контроль доступа и так далее. - person Dave Newton; 15.06.2014
comment
@DaveNewton За исключением аннотаций только для компиляции, таких как @SuppressWarnings, как фреймворк будет читать аннотации на уровне блоков? Если какой-то фрагмент кода достаточно важен для pointcut, он достаточно важен, чтобы иметь метод. - person chrylis -cautiouslyoptimistic-; 15.06.2014
comment
@chrylis Это два совершенно разных момента. Как на самом деле не имеет значения, так как мы говорим о гипотетической ситуации, но может быть представлено что угодно. Во-вторых, следует ли делать это таким образом, и я склонен согласиться, но также вижу потенциальное применение. - person Dave Newton; 16.06.2014