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

时间:2011-03-25 09:26:32

标签: java spring class-visibility

春天的新手在这里。

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

2 个答案:

答案 0 :(得分:20)

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

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所做的是很多更复杂,因为它们也处理构造函数注入等,但这是如何实例化不可见类(或不可见的构造函数)。

答案 1 :(得分:11)

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