Spring BeanFactory如何实例化非公共类?

Rah*_*hul 7 java spring class-visibility

春天新手在这里.

我观察到Spring能够实例化我定义的非公共类(即具有默认可见性的类).谁能告诉我Spring如何实现这一目标?为什么允许这样做?

Sea*_*oyd 20

好的,这是他们如何做到的.拿这个样本类:

package hidden;  

class YouCantInstantiateMe{

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

}
Run Code Online (Sandbox Code Playgroud)

上面是一个包私有类,在不同的包中有一个私有构造函数,但我们仍然会实例化它:

代码(从不同包中的类运行):

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
}
Run Code Online (Sandbox Code Playgroud)

输出:

该死的,你做到了!


当然Spring的功能复杂得多,因为它们也处理构造函数注入等,但这是如何实例化不可见类(或不可见的构造函数).


Tar*_*log 11

安全管理器是负责检查您(或Spring)是否允许在运行时实例化类的人.如果您使用简单的主类运行,则可能根本没有它.如果将应用程序配置为与Security Manager一起运行,并且不向Spring授予特殊权限,则无法实例化非公共类.