Я хочу, чтобы мой SecurityManager блокировал только invoke
для метода и set
для отражения поля. getDeclaredMethods
или аналогичный должен оставаться разрешенным. Это возможно? Я хочу заблокировать изменение поля security
частного класса java.lang.System
, но все же разрешить отражение. Вот мой код:
public class SecMan extends SecurityManager {
@Override
public void checkPermission(Permission perm) {
if (perm instanceof ReflectPermission) {
// called on setAccessible
// determine whether caller is permitted, but how?
// can't get reference name using getClassContext()
}
}
@Override
public void checkPackageAccess(String pkg) {
if (pkg.startsWith("sun.misc")) {
// do not allow Unsafe, as it could disable my SecurityManager too.
throw new SecurityException();
}
}
@Override
public void checkMemberAccess(Class<?> clazz, int which) {
// not called sadly, deprecated
}
}
В частности, я хочу заблокировать этот код:
Method getDeclaredFields0M = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class);
getDeclaredFields0M.setAccessible(true);
Field[] fields = (Field[]) getDeclaredFields0M.invoke(System.class, false);
Field securityField = null;
for (Field field : fields)
if (field.getName().equals("security")) {
securityField = field;
}
securityField.setAccessible(true);
securityField.set(null, null);