春天的新手在这里。
我观察到Spring能够实例化我定义的非公共类(即具有默认可见性的类)。谁能告诉我Spring如何实现这一目标?为什么允许这样做?
答案 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授予特殊权限,则无法实例化非公共类。