使用反射设置对象属性

时间:2013-01-17 08:28:46

标签: java reflection accessor

我按名称获取类,我需要使用相应的数据更新它们,我的问题是如何使用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;
    }   
}

4 个答案:

答案 0 :(得分:56)

您也可以直接使用反射将值设置为属性,而不是尝试调用setter。例如:

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

仅供参考,这是等效的通用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");

答案 1 :(得分:1)

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

了解您可以发布method.getPagetParameterTypes()的参数 根据结果​​构建您的参数和供应。

答案 2 :(得分:1)

更新名字

  • 首先找到您要更新的字段
  • 然后找到mutator(接受字段&#39; s类型的参数)
  • 最后使用新值:
  • 对对象执行mutator
Field field=classHandle.getDeclaredField("firstName");
Method setter=classHandle.getMethod("setFirstName", field.getType());
setter.invoke(myObject, "new value for first name");

答案 3 :(得分:0)

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("shivritesh9984@gmail.com");
    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));
   }

   }

 }