web-dev-qa-db-ja.com

リフレクションを使用してオブジェクトプロパティを設定する

私は名前でクラスを取得し、それぞれのデータでそれらを更新する必要があり、私の質問は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].*")

そして、私はそれをどのように行うことができますか?.

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

public class Person {

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

    public void setFirstName(String FirstName) {
        this.FirstName = FirstName;
    }   
}
24
Stefan Strooves

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

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

参考までに、同等のgeneric getter

@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");
59
sp00m
_if (method.getName().matches("set[A-Z].*") {
  method.invoke(person,salary)
  // and so on
}
_

パラメーターを知るために、結果に基づいてmethod.getPagetParameterTypes()を発行して、パラメーターを作成して提供します。

1
TheWhiteRabbit

名を更新するには

  • 最初に更新するフィールドを見つけます
  • 次に、ミューテーター(フィールドの型の引数を受け入れる)を見つけます。
  • 最後に、新しい値を使用してオブジェクトに対してミューテーターを実行します。
Field field=classHandle.getDeclaredField("firstName");
Method setter=classHandle.getMethod("setFirstName", field.getType());
setter.invoke(myObject, "new value for first name");
1
paralaks
package Apple;

import Java.lang.reflect.Field;
import Java.lang.reflect.Type;
import Java.util.Map.Entry;
import Java.util.Set;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;

/*
* Employe Details class
 */
class Employee {

   private long id;
   private String name;
   private String userName;
   private Address address;
   private Contact contact;
   private double salary;

   public long getId() {
     return id;
   }
   public void setId(long id) {
      this.id = id;
   }
   public String getName() {
     return name;
   }
   public void setName(String name) {
    this.name = name;
   }
public String getUserName() {
    return userName;
}
public void setUserName(String userName) {
    this.userName = userName;
}
public Address getAddress() {
    return address;
}
public void setAddress(Address address) {
    this.address = address;
}
public Contact getContact() {
    return contact;
}
public void setContact(Contact contact) {
    this.contact = contact;
}
public double getSalary() {
    return salary;
}
public void setSalary(double salary) {
    this.salary = salary;
}
}

/*
 * Address class for employee
*/
class Address {

private String city;
private String state;
private String country;
private int pincode;

public String getCity() {
    return city;
}
public void setCity(String city) {
    this.city = city;
}
public String getState() {
    return state;
}
public void setState(String state) {
    this.state = state;
}
public String getCountry() {
    return country;
}
public void setCountry(String country) {
    this.country = country;
}
public int getPincode() {
    return pincode;
}
public void setPincode(int pincode) {
    this.pincode = pincode;
}

}

/*
 * Contact class for Employee
 */
 class Contact {

private String email;
private String contactNo;

public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public String getContactNo() {
    return contactNo;
}
public void setContactNo(String contactNo) {
    this.contactNo = contactNo;
}

}

public class Server {

public static void main(String args[]) throws JsonSyntaxException, Exception{
    Gson gson = new Gson();

    /*
     * Old Employee Data
     */
    Address address = new Address();
    Contact contact = new Contact();
    Employee employee = new Employee();
    address.setCity("shohna-road");
    address.setCountry("INDIA");
    address.setPincode(12201);
    address.setState("Hariyana");
    contact.setContactNo("+918010327919");
    contact.setEmail("[email protected]");
    employee.setAddress(address);
    employee.setContact(contact);
    employee.setId(4389573);
    employee.setName("RITESH SINGH");
    employee.setSalary(43578349.345);
    employee.setUserName("ritesh9984");
    System.out.println("Employee : "+gson.toJson(employee));

    /* New employee data */
    Employee emp = employee;
    address.setCity("OMAX");
    emp.setAddress(address);
    emp.setName("RAVAN"); 

    /* Update employee with new employee Object*/
    update(employee, gson.fromJson(gson.toJson(emp), JsonObject.class) );

    System.out.println("Employee-Update : "+gson.toJson(employee));
}

/*
 * This method update the @target with new given value of new object in json object form
 */
public static  void update(Object target, JsonObject json) throws Exception {
   Gson gson=new Gson();
   Class<? > class1 = target.getClass();

   Set<Entry<String, JsonElement>> entrySet = json.entrySet();
   for (Entry<String, JsonElement> entry : entrySet) {
       String key = entry.getKey();
       Field field = class1.getDeclaredField(key);
       field.setAccessible(true);
       Type genType = field.getGenericType();

       field.set(target,
               gson.fromJson(entry.getValue(),genType));
   }

   }

 }
0
ritesh9984