old « 使命と魂のリミット | メイン | PC台 自作 » new

privateなコンストラクタを外部から呼ぶ方法(Java)

2010年07月15日

仕事で困ってた問題を解決したのでメモ。

protectedとかprivateのコンストラクタは外部から呼べないけれど、テストとかでどうしてもインスタンスを生成したいときにリフレクションを使ってどうにかしたい。

ただ、Class#newInstance()では生成出来ないので、Fieldを扱う時みたいにどうにかしてsetAccesibleしないといけない。

そこで、getDeclaredConstructorでConstructorインスタンスを取得してから、
setAccessibleして、その後にnewInstanceする。

ここで重要なのは、getConstructorgetではなくDeclaredConstructorを使うこと。
getConstructorgetではprivateコンストラクタは取得できない。

以下サンプル。
警告とか出てるけど一応動いたのでまぁOKでしょう。

class TestClass{
private TestClass(){
System.out.println("hello");
}
}

public class TestReflection {
public static void main(String[] args) throws Exception {
Class clazz = TestClass.class;
Constructor<TestClass> con =
(Constructor<TestClass>)clazz.getDeclaredConstructor();
con.setAccessible(true);
con.newInstance();
}
}
このエントリーをはてなブックマークに追加

old « 使命と魂のリミット | メイン | PC台 自作 » new

トラックバックURL

このエントリーのトラックバックURL:
http://blog.hp-improve.com/mt/mt-tb.cgi/1063

コメント

なるほど、分からん。

これ見て分かったとか言われたら泣ける。

コメントする