ОК, вот как они это делают. Возьмите этот пример класса:
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, на намного более сложно, потому что они также имеют дело с Внедрением Конструктора и т. Д., Но это то, как создавать экземпляры невидимых классов (или невидимых конструкторов).