簡體   English   中英

Spring BeanFactory如何能夠實例化一個非公共類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM