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
コメント
なるほど、分からん。
Posted by: マッキー | 2010年07月15日 23:39
これ見て分かったとか言われたら泣ける。
Posted by: 祐介 | 2010年07月16日 06:46