যেমন অন্যান্য পোস্টারগুলি ইঙ্গিত করেছে, setAccessible
কেবলমাত্র আপনার সেই ক্ষেত্রে প্রযোজ্য java.lang.reflect.Field
তাই অ্যাক্সেসিবিলিটিটিকে তার আসল অবস্থায় ফিরিয়ে আনার প্রয়োজন নেই।
যাহোক...
আপনি যদি নিজের কলগুলি field.setAccessible(true)
অবিচলিত হতে চান তবে আপনাকে java.lang.Class
এবং এর মধ্যে অন্তর্নিহিত পদ্ধতিগুলি ব্যবহার করতে হবে java.lang.reflect.Field
। প্রকাশ্য পদ্ধতি মুখোমুখি আপনি পাঠাতে কপি এর Field
উদাহরণ হিসেবে বলা যায়, তাই এটি "ভুলে" প্রতিটি সময় পরে আপনি ভালো কিছু করতেclass.getField(name)
import java.lang.reflect.*;
import sun.reflect.FieldAccessor;
public class Reflect {
private static Method privateGetDeclaredFields;
private static Method getFieldAccessor;
public static Field[] fields(Class<?> clazz) throws Exception {
return (Field[]) privateGetDeclaredFields.invoke(clazz, false);
}
public static <T> T get(Object instance, Field field) throws Exception {
return ((FieldAccessor) getFieldAccessor.invoke(field, instance)).get(instance);
}
public static void set(Object instance, Field field, Object value) throws Exception {
((FieldAccessor) getFieldAccessor.invoke(field, instance)).set(instance, value);
}
static {
try {
// These are used to access the direct Field instances instead of the copies you normally get through #getDeclaredFields.
privateGetDeclaredFields = Class.class.getDeclaredMethod("privateGetDeclaredFields", boolean.class);
privateGetDeclaredFields.setAccessible(true);
getFieldAccessor = Field.class.getDeclaredMethod("getFieldAccessor", Object.class);
getFieldAccessor.setAccessible(true);
} catch (Exception e) {
// Should only occur if the internals change.
e.printStackTrace();
}
}
}
আপডেট : এই প্রয়োগটি জাভা 8 এর জন্য, ভবিষ্যতের সংস্করণগুলি ব্যাকএন্ড পরিবর্তন করে যা এটি ভেঙে দেয়। আপনি যদি সত্যিই এই কৌশলটি চালিয়ে যেতে চান তবে একই ধারণাটি এখনও প্রযোজ্য।