Java apache commons ConstructorUtils サンプルプログラム
ConstructorUtilsの説明(google翻訳)
MethodUtilsの後にモデル化されたコンストラクタに焦点を当てたユーティリティリフレクションメソッド。
既知の制限事項
デフォルトアクセススーパークラスでのパブリックコンストラクタへのアクセス
デフォルトのアクセススーパークラスに含まれるpublicコンストラクタを呼び出すときに問題があります。 Reflectionはこれらのコンストラクタを正しく探し出し、それらをpublicとして割り当てます。ただし、コンストラクタが呼び出されると、IllegalAccessExceptionがスローされます。
ConstructorUtilsには、この状況の回避策が含まれています。このコンストラクタでAccessibleObject.setAccessible(boolean)を呼び出そうとします。この呼び出しが成功した場合、メソッドは通常どおり呼び出すことができます。この呼び出しは、アプリケーションに十分なセキュリティ特権がある場合にのみ成功します。この呼び出しが失敗すると、警告が記録され、メソッドが失敗する可能性があります。
リフレクション (reflection) とは、プログラムの実行過程でプログラム自身の構造を読み取ったり書き換えたりする技術のことを指す。
MethodUtilsのコンストラクタに焦点を当てたものです。既知の制限事項は重要なので、読んでおいた方が良いです。
ConstructorUtils
package jp.pjin.tech.java; import jp.pjin.tech.java.domain.Cat; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.lang3.reflect.ConstructorUtils; public class CommonsExample20 { public static void main(String[] args) throws Exception { Cat c = ConstructorUtils.invokeConstructor(Cat.class, new Object[] {}); c.setId(1); c.setName("ぶち"); c.setType("三毛猫"); System.out.println(ReflectionToStringBuilder.toString(c)); } }
Cat
package jp.pjin.tech.java.domain; import java.io.Serializable; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.EqualsExclude; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; public class Cat implements Serializable { private static final long serialVersionUID = 1L; @EqualsExclude private int id; private String name; private String type; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public String toString() { return ReflectionToStringBuilder.toString(this); } }
Catクラスには、コンストラクターが存在しないので、デフォルトコンストラクターができます。
Cat(){}
みたいなものです。を利用してインスタンスを取得します。
ちなみに、私が書いていた昔の書き方は以下のようになります。
Class<?> cls = Class.forName("jp.pjin.tech.java.domain.Cat"); Object obj = cls.newInstance(); Cat c = (Cat)obj;
最近は、以下のような感じ。
Cat c = Cat.class.newInstance();
デフォルトコンストラクター以外は、パラメータを利用し、コンストラクターをオーバーライドするのですが、
パラメータを渡すことを考えると、ConstructorUtilsを利用したほうが楽かと思います。
クラス名.class を実行するのに違和感を感じますが、文字列の場合はFQCN(完全限定クラス名)を設定しないといけません。
まあ、プロパティーで設定することになるので、なんとも言えませんが。