2017-03-05 14 views
1

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

のものを使用したいですこれに代わるいくつかの方法?

+1

ループを使用することができます、そしてsetNameと呼ばれるものを見つけます。それが過負荷にならないように祈ってください。これはプライベートフィールドとは関係がないことに注意してください。プライベートフィールドを設定するのではなく、ここでパブリックメソッドを呼び出しています。それは、反射に関連するほぼすべての質問のように、反射はおそらくあなたの問題を解決する良い方法ではないと言いました。なぜ文字列の配列ではなく、 'n - > c.setName(n)'を含むコンシューマの配列を使用しないのですか? –

答えて

2

すべてのメソッドを取得し、パラメータに関する情報を入力しているマッチング1、見つける:

String name; 
String value; 
Method[] methods = Child.class.getMethods(); 
for (Method method : methods) { 
    if (!method.getName().equals(name)) 
     continue; 
    Class<?> paramType = method.getParameterTypes()[0]; 
    //You will have to figure how to convert the String value to the parameter. 
    method.invoke(child, paramType.cast(value)); // for example 
} 
+0

すべてのメソッドをループしない方法はありますか? –

+0

@GrzegorzGórkiewiczあなたが知らないというパラメータの種類が分からない限り、パラメータの型がわかっている場合は、 'Child.class.getMethod(name、parameterClass)'を呼び出して正確なメソッドを取得できます。 – Bohemian

+0

しかし、パラメータの型は常に... value.getClass() '...すなわち' data.getClass() 'と同じですか? –

0

あなたはクラスのメソッドを介してのApache CommonsのFieldUtils.writeDeclaredField

Child childObject = new Child(); 
FieldUtils.writeDeclaredField(childObject, "name", "John", true); 
関連する問題