Как запретить разработчикам использовать отражение для доступа к приватным методам и конструкторам в Java? - программирование
Подтвердить что ты не робот

Как запретить разработчикам использовать отражение для доступа к приватным методам и конструкторам в Java?

Как запретить разработчикам использовать отражение для доступа к частным методам и конструкторам в Java?

Используя обычный Java-код, мы не можем получить доступ к закрытым конструкторам или частным методам вне класса. Но, используя отражение, мы можем получить доступ к любым частным методам и конструкторам в классе Java.

Итак, как мы можем обеспечить безопасность нашего Java-кода?

4b9b3361

Ответ 2

Добавьте метод 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();
    }
} 

Ответ 3

Вы (как разработчик данного кода) не можете этого сделать.

Конечный пользователь, который запускает приложение, может установить SecurityManager, который запрещает отображение.