33

名前でクラスを取得し、それぞれのデータでそれらを更新する必要があります。私の質問は、メソッドにダミーデータを追加したいJavaでそれを行う方法です。クラスの種類がわからないクラス名を取得し、リフレクションを使用してデータを取得するだけです

このコードを使用してクラス インスタンスを取得し、

Class<?> classHandle = Class.forName(className);

Object myObject = classHandle.newInstance();

// iterate through all the methods declared by the class
for (Method method : classHandle.getMethods()) {
    // find all the set methods
    if (method.getName().matches("set[A-Z].*")

そして、データで更新したいsetメソッドのリストを見つけたことを知っています。どうすればそれを行うことができますか。

クラス名に person があり、クラスに setSalary と setFirstName などがあると仮定すると、どうすればそれらをリフレクションで設定できますか?

public class Person {

    public void setSalery(double salery) {
        this.salery = salery;
    }

    public void setFirstName(String FirstName) {
        this.FirstName = FirstName;
    }   
}
4

4 に答える 4

82

セッターを呼び出そうとする代わりに、リフレクションを使用してプロパティに値を直接設定することもできます。例えば:

public static boolean set(Object object, String fieldName, Object fieldValue) {
    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(object, fieldValue);
            return true;
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return false;
}

電話:

Class<?> clazz = Class.forName(className);
Object instance = clazz.newInstance();
set(instance, "salary", 15);
set(instance, "firstname", "John");

参考までに、同等の汎用ゲッターは次のとおりです。

@SuppressWarnings("unchecked")
public static <V> V get(Object object, String fieldName) {
    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            return (V) field.get(object);
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return null;
}

電話:

Class<?> clazz = Class.forName(className);
Object instance = clazz.newInstance();
int salary = get(instance, "salary");
String firstname = get(instance, "firstname");
于 2013-01-17T08:36:07.980 に答える
2

名を更新するには

  • まず、更新するフィールドを見つけます
  • 次に、ミューテーター (フィールドの型の引数を受け入れる) を見つけます。
  • 最後に、オブジェクトのミューテーターを新しい値で実行します。
Field field=classHandle.getDeclaredField("firstName");
Method setter=classHandle.getMethod("setFirstName", field.getType());
setter.invoke(myObject, "new value for first name");
于 2016-07-12T18:07:16.890 に答える
1
if (method.getName().matches("set[A-Z].*") {
  method.invoke(person,salary)
  // and so on
}

method.getPagetParameterTypes() 結果に基づいて発行できるパラメーターを知るには、パラメーターを作成して指定します。

于 2013-01-17T08:33:26.840 に答える