9

ここで春の初心者。

Springは、私が定義した非公開クラス(つまり、デフォルトの可視性を持つクラス)をインスタンス化できることを確認しました。Springがこれをどのように達成するか誰か教えてもらえますか?なぜこれが許可されるのですか?

4

2 に答える 2

21

OK、これが彼らのやり方です。このサンプルクラスを受講してください。

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が行うことは、コンストラクターインジェクションなども処理するため、はるかに複雑ですが、これは、非表示のクラス(または非表示のコンストラクター)をインスタンス化する方法です。

于 2011-03-25T11:04:04.227 に答える
11

あなた(またはSpring)が実行時にクラスをインスタンス化できるかどうかを確認する責任があるのは、Security Managerです。単純なメイン クラスで実行している場合は、おそらくまったく持っていません。Security Manager で実行するようにアプリケーションを構成し、Spring に特別なアクセス許可を付与しない場合、非パブリック クラスをインスタンス化することはできません。

于 2011-03-25T09:35:45.650 に答える