Фреймворк и безопасность Java - PullRequest
6 голосов
/ 16 апреля 2010

Предположим, у меня есть одноэлементный класс во внешней библиотеке приложения. Но все же я могу создавать экземпляры этого конкретного класса, используя отражение. Как это

    Class clas = Class.forName(Private.class.getName());

    for(Constructor c : clas.getDeclaredConstructors()){
        c.setAccessible(true);
        Private p = (Private) c.newInstance();
        System.out.println(p);
    }

Как я могу ограничить это? .

Спасибо J

Ответы [ 7 ]

6 голосов
/ 16 апреля 2010

Используя SecurityManager и контролируя управление ReflectPermission("suppressAccessChecks") ( пример ).

Менеджер безопасности влияет на производительность, и он редко используется на стороне сервера.

1 голос
/ 16 апреля 2010

Если вы говорите, в частности, о синглетах: это одна из причин, почему лучший способ их реализации - через enum:

public enum YourSingleton {
    INSTANCE;
    // methods go here
} 

Если вы говорите об использовании setAccessible() в целом: если код написан кем-то, кому вы не доверяете, чтобы не делать таких закулисных трюков, вам все равно не следует запускать его (или запускать в песочнице). ). Среди разработчиков публичную / приватную следует рассматривать как метаинформацию о том, как код предназначен для использования, а не как средство защиты.

0 голосов
/ 16 апреля 2010

Вы можете сделать это так.

private static final Private INSTANCE = new Private();
    private Private() {
        if(INSTANCE !=null)
            throw new IllegalStateException("Already instantiated");
    }
     public static Private getInstance() {
            return INSTANCE;
        }
0 голосов
/ 16 апреля 2010

AFAIK, это своего рода метапрограммирование и, следовательно, требует проверки на другом уровне абстракции. Я полагаю, что из Javadoc вы должны использовать SecurityManager для принудительного исполнения желаемого поведения: setAccessible () . Вообще-то, ИМХО, вы должны действительно знать, что вы делаете, когда вы занимаетесь метапрограммированием, и изменение доступа должно иметь веские причины для этого.

0 голосов
/ 16 апреля 2010

Я не думаю, что вы можете ограничить это.

Очевидно, что опасно / сомнительно использовать рефлексию для доступа к частным частям других ( snicker ), но иногда это необходимо для различных типов инструментов и приложений.

0 голосов
/ 16 апреля 2010

Короче говоря: вы не можете .

Любой конструктор, как открытый, так и приватный, может быть доступен с помощью отражения и может использоваться для создания нового объекта.

Вам нужно будет прибегнуть к другим методам, таким как SecurityManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...