Saya pikir ini tidak mungkin di Jawa karena anotasi dan parameternya diselesaikan pada waktu kompilasi. Saya memiliki antarmuka sebagai berikut,
public interface FieldValues {
String[] FIELD1 = new String[]{"value1", "value2"};
}
dan kelas lain sebagai,
@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
....
}
Saya menandai banyak kelas dengan anotasi dan saya ingin tahu apakah saya dapat menghindari menentukan string dalam setiap anotasi yang saya lebih suka gunakan
@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
....
}
Namun ini memberikan kesalahan kompilasi seperti nilai penjelasan harus menjadi initializer array dll. Apakah ada yang tahu bagaimana saya bisa menggunakan konstanta String atau String [] konstan untuk memasok nilai ke anotasi?
sumber
enum
dalam annotatios, tetapi mereka tidak konstan waktu kompilasi. Perbedaannya menjadi jelas ketika Anda menulisstatic final EnumType VARIABLE = EnumType.ENUM_CONSTANT;
dan mencoba menggunakannyaVARIABLE
dalam anotasi; itu tidak akan berhasil. Anda hanya dapat menggunakanEnumType.ENUM_CONSTANT
yang bukan ekspresi konstan, tetapi secara khusus diizinkan dalam anotasi (danswitch
pernyataan).Anda dapat menggunakan konstanta (yaitu variabel statis, akhir) sebagai parameter untuk anotasi. Sebagai contoh cepat, saya sering menggunakan sesuatu seperti ini:
Perhatikan bahwa mungkin untuk lulus
TEST_TIMEOUT
konstanta langsung ke anotasi.Begitu saja, saya tidak ingat pernah mencoba ini dengan sebuah array, jadi Anda mungkin mengalami beberapa masalah dengan sedikit perbedaan dalam bagaimana array direpresentasikan sebagai parameter anotasi dibandingkan dengan variabel Java? Tetapi untuk bagian lain dari pertanyaan Anda, Anda pasti bisa menggunakan String konstan tanpa masalah.
EDIT: Saya baru saja mencoba ini dengan array String, dan tidak mengalami masalah yang Anda sebutkan - namun kompiler itu memberi tahu saya bahwa "nilai atribut harus konstan" meskipun array didefinisikan sebagai
public static final String[]
. Mungkin tidak suka fakta bahwa array bisa berubah? Hmm ...sumber
Anda tidak menyediakannya dengan array dalam contoh Anda. Kompilasi berikut baik-baik saja:
sumber
Sayangnya, Anda tidak dapat melakukan ini dengan array. Dengan variabel non-array, nilainya harus final statis.
sumber
Dengan Seam 2 http://seamframework.org/ Anda dapat menyelesaikan parameter anotasi saat runtime, dengan bahasa ekspresi di dalam tanda kutip ganda.
Dalam Seam 3 http://seamframework.org/Seam3/Solder , fitur ini adalah modul Seam Solder
sumber
Anda dapat menggunakan enum dan merujuk enum itu di bidang anotasi
sumber