Javaリフレクションの使用中に、パラメータタイプを知らせることなくプライベートフィールドを設定できますか?例えばJava Reflectionを使用してプライベートフィールドを設定する
、これは私のChild
クラスであるならば、私は私のTester
クラスでこのChild
クラスのフィールドを設定したい
package reflection;
public class Child {
private String name;
private Integer value;
private boolean flag;
public String getLName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getValue()
{
return this.value;
}
public void setValue(Integer value)
{
this.value = value;
}
public boolean getFlag()
{
return this.flag;
}
public void setFlag(boolean flag)
{
this.flag = flag;
}
public String toString()
{
return "Name" + this.name;
}
}
。
package reflection;
public class Tester {
public static void main(String args[]) throws Exception
{
Class<?> clazz = Class.forName("reflection.Child");
Object cc = clazz.newInstance();
cc.getClass().getMethod("setName", String.class).invoke(cc,"AAA");
}
}
ここでは、Name
フィールドの値を設定しています。ラインで 、私はString.class
を使用している
cc.getClass().getMethod("setName", String.class).invoke(cc,"AAA");
。フィールドタイプを伝えることなく、これを行う方法はありますか?どのようにJavaが自動的に型を識別できるか? これは、ファイル名から名前、値、フラグのデータを取得するためで、ループを使用して3つのフィールドをすべて1行に設定したいからです。 私は値と文字列の配列を宣言します - 私は上記の文が間違っているが、知っている「のsetName」、「setValueの」および「SETFLAG」と、私は、次の
cc.getClass().getMethod(array[index]).invoke(cc,data);
のものを使用したいですこれに代わるいくつかの方法?
ループを使用することができます、そしてsetNameと呼ばれるものを見つけます。それが過負荷にならないように祈ってください。これはプライベートフィールドとは関係がないことに注意してください。プライベートフィールドを設定するのではなく、ここでパブリックメソッドを呼び出しています。それは、反射に関連するほぼすべての質問のように、反射はおそらくあなたの問題を解決する良い方法ではないと言いました。なぜ文字列の配列ではなく、 'n - > c.setName(n)'を含むコンシューマの配列を使用しないのですか? –