Вы не можете так делать. setAccessible(true)
влияет только на текущую ссылку на поле при текущем выполнении вашей программы (то есть , это не влияет на выполнение результирующей модифицированной программы ).
Чтобы получить доступ к закрытому полю при запуске вашей модифицированной программы, вам, в основном, нужно встроить соответствующие шаги отражения в программу.
Для доступа к закрытому полю YourClass.thePrivatefield
некоторого объекта, хранящегося в локальной переменной varId
, вы делаете что-то вроде
// Get hold of the field-reference
mv.visitLdcInsn(Type.getType("LYourClass;"));
mv.visitLdcInsn("thePrivateField");
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/Class",
"getDeclaredField",
"(Ljava/lang/String;)Ljava/lang/reflect/Field;");
// Duplicate the reference
mv.visitInsn(DUP);
// Call setAccessible(true) using the first reference.
mv.visitInsn(ICONST_1);
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/reflect/Field",
"setAccessible",
"(Z)V");
// Call get(yourObject) using the second reference to the field.
mv.visitInsn(ALOAD, varId);
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/reflect/Field",
"get",
"(Ljava/lang/Object;)Ljava/lang/Object;");
Если поле, которое вы пытаетесь сделать доступным, является частью базы cobe, которую вы переписываете, вы, очевидно, можете также сделать это поле общедоступным, используя ACC_PUBLIC
вместо ACC_PRIVATE
.