Как да анотирате кодов блок в 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 – показва видовете програмни елементи, към които е приложим тип анотация. Някои възможни стойности са TYPE, METHOD, CONSTRUCTOR, FIELD и т.н. Ако целевата мета-анотация не присъства, тогава анотацията може да се използва за всеки програмен елемент.

Всеки програмен елемент (предполагам) означава и блокиране, нали? Така че защо не мога да коментирам блокиране или за? какво ми липсва

Благодаря за помощта


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:

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

Анотациите могат да се използват и върху константи enum.

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