Ответ 1
Запустите приложение с помощью SecurityManager
и достаточно ограничительной краткое резюме в учебнике и обширная информация в безопасности документация.
Как запретить разработчикам использовать отражение для доступа к частным методам и конструкторам в Java?
Используя обычный Java-код, мы не можем получить доступ к закрытым конструкторам или частным методам вне класса. Но, используя отражение, мы можем получить доступ к любым частным методам и конструкторам в классе Java.
Итак, как мы можем обеспечить безопасность нашего Java-кода?
Запустите приложение с помощью SecurityManager
и достаточно ограничительной краткое резюме в учебнике и обширная информация в безопасности документация.
Добавьте метод checkPermission()
во весь ваш частный метод/конструктор.
checkPermission с помощью sun.reflect.Reflection.getCallerClass(int n)
с помощью assert callerClass=selfClass
.
getCallerClass
возвращает класс метода realFramesToSkip
фреймов в стек (с нулевым основанием), игнорируя фреймы, связанные с java.lang.reflect.Method.invoke()
и его реализацию. Первый кадр связан с этим методом, поэтому getCallerClass(0)
возвращает объект класса для sun.reflect.Reflection
.
public class PrivateConstructorClass {
private PrivateConstructorClass() {
checkPerMission();
//you own code go below
}
void checkPerMission() {
Class self = sun.reflect.Reflection.getCallerClass(1);
Class caller = sun.reflect.Reflection.getCallerClass(3);
if (self != caller) {
throw new java.lang.IllegalAccessError();
}
}
}
Вы можете попробовать протестировать рефлексию, это не удастся:
public class TestPrivateMain {
Object newInstance() throws Exception {
final Class<?> c = Class.forName("package.TestPrivate");
final Constructor<?> constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
return constructor.newInstance();
}
public static void main(String[] args) throws Exception {
Object t = new TestPrivateMain().newInstance();
}
}
Вы (как разработчик данного кода) не можете этого сделать.
Конечный пользователь, который запускает приложение, может установить SecurityManager, который запрещает отображение.