Использование отражения для установки свойства объекта

Я получаю класс по имени, и мне нужно обновить их соответствующими данными, и мой вопрос: как это сделать с помощью 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, который я хочу обновить с помощью данных как я могу это сделать.

Предположим, что в имени класса у меня есть человек и у класса есть setSalary и setFirstName и т.д. как я могу установить их с отражением?

public class Person {

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

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

Ответ 1

Вместо того, чтобы пытаться вызвать сеттер, вы также можете просто установить значение свойства с помощью отражения. Например:

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

FYI, вот эквивалентный общий геттер:

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

Ответ 2

if (method.getName().matches("set[A-Z].*") {
  method.invoke(person,salary)
  // and so on
}

чтобы узнать параметры, которые вы можете указать method.getPagetParameterTypes() на основе результата постройте параметры и поставку.

Ответ 3

Чтобы обновить первое имя

  • Сначала найдите поле, которое хотите обновить.
  • Затем найдите мутатор (который принимает аргумент типа поля)
  • Наконец, запустите мутатор объекта с новым значением:
Field field=classHandle.getDeclaredField("firstName");
Method setter=classHandle.getMethod("setFirstName", field.getType());
setter.invoke(myObject, "new value for first name");

Ответ 4

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

   }

 }