Dalam senario di mana kelas pra-disusun diimport dan sebahagian daripada laluan kelas, ia boleh diingini untuk mengubah suai parameter rentetan anotasi pada masa jalan. Artikel ini meneroka pendekatan yang mungkin untuk mencapai matlamat ini.
Untuk menukar nilai anotasi bagi kunci tertentu bagi anotasi yang diberikan, ikut langkah di bawah:
Dapatkan semula pengendali invokasi untuk penggunaan anotasi Proxy.getInvocationHandler(anotasi):
Object handler = Proxy.getInvocationHandler(annotation);
Dapatkan medan memberValues daripada pengendali dengan mengakses medan yang diisytiharkan dan menetapkan kebolehaksesannya kepada benar:
Field f = handler.getClass().getDeclaredField("memberValues"); f.setAccessible(true);
Dapatkan nilai ahli sebagai a peta:
Map<String, Object> memberValues = (Map<String, Object>) f.get(handler);
Dapatkan nilai lama dari peta menggunakan kekunci:
Object oldValue = memberValues.get(key);
Kemas kini peta dengan nilai baharu :
memberValues.put(key, newValue);
Pertimbangkan kelas beranotasi berikut:
@ClassAnnotation("class test") public static class TestClass { @FieldAnnotation("field test") public Object field; @MethodAnnotation("method test") public void method() {} }
Untuk mengubah suai nilai anotasi pada masa jalan, gunakan kod berikut:
Field field = TestClass.class.getField("field"); final FieldAnnotation fieldAnnotation = field.getAnnotation(FieldAnnotation.class); System.out.println("old FieldAnnotation = " + fieldAnnotation.value()); changeAnnotationValue(fieldAnnotation, "value", "another field annotation value"); System.out.println("modified FieldAnnotation = " + fieldAnnotation.value());
Pendekatan ini membolehkan anda secara dinamik ubah suai parameter anotasi tanpa membuat contoh anotasi baharu, mengurangkan keperluan untuk pengetahuan lanjut tentang anotasi konkrit kelas.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Suai Parameter Rentetan Anotasi Definisi Kelas pada Masa Jalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!