Rumah >Java >javaTutorial >Bagaimanakah saya boleh mengubah suai Nilai Anotasi Tersuai pada Masa Jalan di Java?
Mengubah suai Nilai Anotasi Tersuai pada Masa Jalan
Soalan ini menangani cabaran mengubah suai parameter rentetan anotasi untuk kelas terkumpul yang wujud dalam laluan kelas di masa jalan. Khususnya, matlamatnya adalah untuk mengubah nilai parameter tanpa menjejaskan kod sumber asal.
Penyelesaian
Untuk menangani cabaran ini, kami memanfaatkan keupayaan refleksi Java dan ejen Java tersuai.
Pelaksanaan
import java.lang.annotation.Annotation; import java.lang.instrument.Instrumentation; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Map; public class AnnotationModifierAgent { public static void premain(String agentArgs, Instrumentation inst) { inst.addTransformer((loader, className, classBeingRedefined, protectionDomain, classfileBuffer) -> { if (className.equals("your.package.Foobar")) { Class<?> foobarClass = loader.loadClass(className); Annotation[] annotations = foobarClass.getAnnotations(); for (Annotation annotation : annotations) { try { modifyAnnotationValue(annotation, "someProperty", "new value"); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } return classfileBuffer; }); } @SuppressWarnings("unchecked") public static void modifyAnnotationValue(Annotation annotation, String key, Object newValue) throws NoSuchFieldException, IllegalAccessException { InvocationHandler handler = Proxy.getInvocationHandler(annotation); Field f = handler.getClass().getDeclaredField("memberValues"); f.setAccessible(true); Map<String, Object> memberValues = (Map<String, Object>) f.get(handler); memberValues.put(key, newValue); } }
Penggunaan
Untuk menggunakan ini pendekatan, anda perlu melampirkan ejen Java tersuai pada JVM apabila ia dimulakan. Ini boleh dicapai menggunakan pilihan -javaagent apabila melancarkan JVM.
java -javaagent:/path/to/AnnotationModifierAgent.jar your.main.class ...
Kini, apabila kelas beranotasi dimuatkan pada masa jalan, ejen Java akan memintasnya dan mengubah suai nilai anotasi dengan sewajarnya.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengubah suai Nilai Anotasi Tersuai pada Masa Jalan di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!