sirven reflexion que para las example ejemplo crear categorias anotaciones annotation java arrays annotations

reflexion - Cómo proporcionar valor a una anotación de un Java constante



reflection en java (5)

Estoy pensando que esto puede no ser posible en Java porque la anotación y sus parámetros se resuelven en tiempo de compilación. Tengo una interfaz de la siguiente manera

public interface FieldValues { String[] FIELD1 = new String[]{"value1", "value2"}; }

y otra clase como,

@SomeAnnotation(locations = {"value1", "value2"}) public class MyClass { .... }

Marqué muchas clases con la anotación y me gustaría saber si puedo evitar especificar las cadenas en cada anotación que preferiría usar.

@SomeAnnotation(locations = FieldValues.FIELD1) public class MyClass { .... }

Sin embargo, esto proporciona errores de compilación, como el valor de anotación debe ser un inicializador de matriz, etc. ¿Alguien sabe cómo puedo usar una constante de cadena o una constante String [] para proporcionar valor a una anotación?


¿Alguien sabe cómo puedo usar una constante String o una constante String [] para proporcionar valor a una anotación?

Desafortunadamente, no puedes hacer esto con arreglos. Con variables que no son de matriz, el valor debe ser estático final.


Estoy pensando que esto no es posible en Java porque la anotación y sus parámetros se resuelven en el momento de la compilación.

Con Seam 2 http://seamframework.org/ usted pudo resolver los parámetros de anotación en tiempo de ejecución, con el lenguaje de expresión entre comillas dobles.

En Seam 3 esta característica es el módulo Seam Solder http://seamframework.org/Seam3/Solder


Las constantes de compilación solo pueden ser primitivas y cadenas :

15.28. Expresiones constantes

Una expresión constante de tiempo de compilación es una expresión que denota un valor de tipo primitivo o una cadena que no se completa abruptamente y se compone solo con lo siguiente:

  • Literales de tipo primitivo y literales de tipo String
  • Lanza a tipos y moldes primitivos para escribir String
  • [...] operadores [...]
  • Expresiones entre paréntesis cuya expresión contenida es una expresión constante.
  • Nombres simples que hacen referencia a variables constantes.
  • Nombres calificados de la forma TypeName . Identificador que se refiere a variables constantes.

De hecho, en Java no hay forma de proteger elementos en una matriz. En tiempo de ejecución, alguien siempre puede hacer FieldValues.FIELD1[0]="value3" , por lo tanto, la matriz no puede ser realmente constante si miramos más profundamente.


No le está suministrando una matriz en su ejemplo. Lo siguiente compila bien:

public @interface SampleAnnotation { String[] sampleValues(); } public class Values { public static final String v1 = "A"; public static final String v2 = "B"; @SampleAnnotation(sampleValues = { v1, v2 }) public void foo() { } }


Puede usar una constante (es decir, una variable estática, final) como parámetro para una anotación. Como un ejemplo rápido, uso algo como esto con bastante frecuencia:

import org.junit.Test; import static org.junit.Assert.*; public class MyTestClass { private static final int TEST_TIMEOUT = 60000; // one minute per test @Test(timeout=TEST_TIMEOUT) public void testJDK() { assertTrue("Something is very wrong", Boolean.TRUE); } }

Tenga en cuenta que es posible pasar la constante TEST_TIMEOUT directamente a la anotación.

A primera vista, no recuerdo haber intentado esto con una matriz, por lo que podría encontrarse con algunos problemas con ligeras diferencias en cómo las matrices se representan como parámetros de anotación en comparación con las variables de Java. Pero en cuanto a la otra parte de su pregunta, definitivamente podría usar una Cadena constante sin ningún problema.

EDITAR: Acabo de probar esto con una matriz String, y no me encontré con el problema que mencionaste; sin embargo, el compilador me dijo que el "valor del atributo debe ser constante" a pesar de que la matriz se define como public static final String[] Tal vez no le gusta el hecho de que las matrices son mutables? Hmm ...