ここで春の初心者。
Springは、私が定義した非公開クラス(つまり、デフォルトの可視性を持つクラス)をインスタンス化できることを確認しました。Springがこれをどのように達成するか誰か教えてもらえますか?なぜこれが許可されるのですか?
ここで春の初心者。
Springは、私が定義した非公開クラス(つまり、デフォルトの可視性を持つクラス)をインスタンス化できることを確認しました。Springがこれをどのように達成するか誰か教えてもらえますか?なぜこれが許可されるのですか?
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が行うことは、コンストラクターインジェクションなども処理するため、はるかに複雑ですが、これは、非表示のクラス(または非表示のコンストラクター)をインスタンス化する方法です。
あなた(またはSpring)が実行時にクラスをインスタンス化できるかどうかを確認する責任があるのは、Security Managerです。単純なメイン クラスで実行している場合は、おそらくまったく持っていません。Security Manager で実行するようにアプリケーションを構成し、Spring に特別なアクセス許可を付与しない場合、非パブリック クラスをインスタンス化することはできません。