Как Spring BeanFactory может создавать закрытый класс? - PullRequest
7 голосов
/ 25 марта 2011

Весенний новичок здесь.

Я заметил, что Spring смог создать экземпляр закрытого класса (то есть класса с видимостью по умолчанию), который я определил. Может кто-нибудь сказать мне, как Spring достигает этого? Почему это разрешено?

Ответы [ 2 ]

20 голосов
/ 25 марта 2011

ОК, вот как они это делают. Возьмите этот пример класса:

package hidden;  

class YouCantInstantiateMe{

    private YouCantInstantiateMe(){
        System.out.println("Damn, you did it!!!");
    }

}

Вышеприведенный класс является закрытым для пакета классом с закрытым конструктором в другом пакете, но мы по-прежнему будем его создавать:

Код (запускается из класса в другом пакете):

public static void main(final String[] args) throws Exception{
    Class<?> clazz = Class.forName("hidden.YouCantInstantiateMe");
                                            // load class by name
    Constructor<?> defaultConstructor = clazz.getDeclaredConstructor();
    // getDeclaredConstructor(paramTypes) finds constructors with
    // all visibility levels, we supply no param types to get the default
    // constructor
    defaultConstructor.setAccessible(true); // set visibility to public
    defaultConstructor.newInstance();       // instantiate the class
}

Выход:

Блин, ты это сделал !!!


Конечно, то, что делает Spring, на намного более сложно, потому что они также имеют дело с Внедрением Конструктора и т. Д., Но это то, как создавать экземпляры невидимых классов (или невидимых конструкторов).

11 голосов
/ 25 марта 2011

Ответственный за проверку того, разрешено ли вам (или Spring) создавать экземпляр класса во время выполнения, - Security Manager . Если вы работаете с простым основным классом, вы, вероятно, не имеете его вообще. Если вы сконфигурируете свое приложение для работы с Security Manager и не предоставите Spring специальные разрешения, оно не сможет создавать экземпляры закрытых классов.

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