[英]How is Spring BeanFactory able to instantiate a non-public class?
春天的新手在這里。
我觀察到Spring可以實例化我定義的非公共類(即具有默認可見性的類)。 誰能告訴我Spring是如何實現這一目標的? 為什么允許這樣做?
好的,這就是他們的做法。 采取以下示例類:
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要做的事情要復雜得多 ,因為它們還處理構造函數注入等,但這是實例化不可見類(或不可見構造函數)的方法。
負責檢查您(或Spring)是否可以在運行時實例化類的人是Security Manager 。 如果您使用簡單的主類運行,則可能根本沒有。 如果您將應用程序配置為與Security Manager一起運行,並且不向Spring授予特殊權限,則它將無法實例化非公共類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.