Constructorオブジェクトを使ってみる
commons-loggingのソース解析を読んでいて興味がわいたので、Constructorオブジェクトを使ったインスタンス生成を試しました。
内部クラスで試してみたら例外発生。デバッグ実行してみるとparameterTypesの配列長が1になっています。
内部クラスの時はnewInstance()メソッドに自分を含む外側のクラスのインスタンス(もしくはnull)を渡さないとダメなんですね。
package hoge.foo.var; import java.lang.reflect.Constructor; public class GetConstructorSample { public static void main(String[] args) { try { Constructor<SomeClass> con = SomeClass.class.getConstructor(); SomeClass sc = (SomeClass)con.newInstance(); sc.setName("hoge"); p(sc.getName()); } catch (Exception e) { e.printStackTrace(); } try { Constructor[] constructors = GetConstructorSample.InnerClass.class.getConstructors(); Constructor con = constructors[0]; Object[] objArr = new Object[1]; // objArr[0] = null; // OK // objArr[0] = new Object(); // java.lang.IllegalArgumentException: argument type mismatch // objArr[0] = (Object) new SomeClass(); // java.lang.IllegalArgumentException: argument type mismatch objArr[0] = (Object) new GetConstructorSample(); InnerClass ic = (InnerClass)con.newInstance(objArr); ic.setName("foo"); p(ic.getName()); } catch (Exception e) { e.printStackTrace(); } try { Constructor con = InnerClass.class.getConstructor(GetConstructorSample.class); Object[] objArr = new Object[1]; objArr[0] = (Object)new GetConstructorSample(); InnerClass ic = (InnerClass)con.newInstance(objArr); ic.setName("var"); p(ic.getName()); } catch (Exception e) { e.printStackTrace(); } } public class InnerClass { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public static void p(Object obj) { System.out.println(obj); } }
package hoge.foo.var; public class SomeClass { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }