Posso usar anotações Java para definir verificações de tempo de compilação?

Por exemplo, eu queria criar a anotação @Out para direcionar parâmetros. Então, de alguma forma, usaria o compilador para verificar se o valor do parâmetro está definido antes que a função retorne. Isso é possível?

Também estava pensando em uma anotação @Immutable que não permitiria que nenhum método não anotado com @Const fosse invocado ou acessasse qualquer campo público. (tempo de compilação e provavelmente tempo de execução?)

Até agora eu tenho isso:

//I'm assuming Class retention is a subset of Runtime retention
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Out
{
    //no idea what to go in here.
}

essa é a outra anotação. novamente, não tenho uma definição completa para isso:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Immutable
{

}

Acho que posso começar a planejar uma estratégia para implementar isso em tempo de execução usando reflexão, mas eu queria instruir o compilador ou o pré-processador a verificar essas coisas para mim, para que minhas anotações tivessem zero de sobrecarga.

Essa é uma daquelas coisas que você pensa "se isso pudesse ter sido feito, já estaria lá fora, e se for, onde posso pegá-lo".

Editar: Depois de pensar mais sobre@Const e@Immutable e depois de lembrar que o java passa ponteiros para objetos por valor, ampliei a definição de@Const, se livrou de@Immutablee alterou a definição de@Out, como segue:

/**
* When Applied to a method, ensures the method doesn't change in any
* way the state of the object used to invoke it, i.e., all the fields
* of the object must remain the same, and no field may be returned,
* unless the field itself is marked as {@code @Const}. A method 
* annotated with {@code @Const} can only invoke other {@code @Const}
* methods of its class, can only use the class's fields to invoke
* {@code @Const} methods of the fields classes and can only pass fields
* as parameters to methods that annotate that formal parameter as
* {@code @Const}.
*
* When applied to a formal parameter, ensures the method will not
* modify the value referenced by the formal parameter. A formal   
* parameter annotated as {@code @Const} will not be aliased inside the
* body of the method. The method is not allowed to invoke another 
* method and pass the annotated parameter, save if the other method 
* also annotates the formal parameter as {@code @Const}. The method is 
* not allowed to use the parameter to invoke any of its type's methods,
* unless the method being invoked is also annotated as {@code @Const}
* 
* When applied to a field, ensures the field cannot be aliased and that
* no code can alter the state of that field, either from inside the   
* class that owns the field or from outside it. Any constructor in any
* derived class is allowed to set the value of the field and invoke any
* methods using it. As for methods, only those annotated as
* {@code @Const} may be invoked using the field. The field may only be
* passed as a parameter to a method if the method annotates the 
* corresponding formal parameter as {@code @Const}
* 
* When applied to a local variable, ensures neither the block where the
* variable is declared or any nested block will alter the value of that 
* local variable. The local variable may be defined only once, at any
* point where it is in scope. Only methods annotated as
* {@code @Const} may be invoked using this variable, and the variable 
* may only be passed as a parameter to another method if said method
* annotates its corresponding formal parameter as {@code @Const}
*
*/
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD,
ElementType.LOCAL_VARIABLE})
@Inherited
public @interface Const
{

}

agora o@Out:

/**
* The formal parameter annotated with {@code @Out} must be undefined in 
* the scope of the caller, and it's the responsibility of the method to
* define it. If allowNull is true, the parameter can be explicitly set
* to null in the body of the method.
*/
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.PARAMETER)
public @interface Out
{
    boolean allowNull() default false;
}

Editar: Estou tentando implementar isso como um plug-in do eclipse, mas estou completamente perdido lendo o manual. Eu escrevi um plugin com a lógica básica para acessar o AST e visitar métodos e campos. Em seguida, fiz várias anotações fictícias que meu plug-in deve detectar e tento imprimir os resultados, mas não tenho certeza do que esperar. Meu plug-in é um plug-in "Incremental Build". Aqui está o código para isso: Se alguém pudesse dar uma olhada e apenas explicar algumas coisas para mim. Estou completamente perdido nesta API.

https://github.com/Starless2001/Plugin-for-Eclipse

questionAnswers(1)

yourAnswerToTheQuestion