Отражение? Пропустив импорт, это должно сработать:
public class A {
private int ii = 23;
}
public class B extends A {
private void readPrivateSuperClassField() throws Exception {
Class<?> clazz = getClass().getSuperclass();
Field field = clazz.getDeclaredField("ii");
field.setAccessible(true);
System.out.println(field.getInt(this));
}
public static void main(String[] args) throws Exception {
new B().readPrivateSuperClassField();
}
}
Это не будет работать, если вы сделаете что-то подобное до вызова readPrivateSuperClassField();
:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkMemberAccess(Class<?> clazz, int which) {
if (clazz.equals(A.class)) {
throw new SecurityException();
} else {
super.checkMemberAccess(clazz, which);
}
}
});
И есть другие условия, при которых подход отражения не будет работать. См. документы API для SecurityManager и AccessibleObject для получения дополнительной информации. Спасибо CPerkins за указание на это.
Я надеюсь, что они просто проверяли ваши знания, а не искали реального применения этого материала ;-) Хотя я думаю, что такой уродливый хак, как этот, может быть законным в некоторых крайних случаях.