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;
	}
	
}