使用reflection设置对象属性

我按名称获取类,我需要使用相应的数据更新它们,我的问题是如何使用java我想要添加方法一些虚拟数据。 我不知道类类型我只是获取类名并使用reflection来获取他的数据

我使用此代码来获取类实例和

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[AZ].*") 

并且知道我找到了我想用数据更新它的set方法的列表我该怎么做。

假设在类名中我得到了人,而类有setSalary和setFirstName等我怎样才能用reflection设置它们?

 public class Person { public void setSalery(double salery) { this.salery = salery; } public void setFirstName(String FirstName) { this.FirstName = FirstName; } } 

您也可以使用reflection直接将值设置为属性,而不是尝试调用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"); 

仅供参考,这是等效的通用吸气剂

 @SuppressWarnings("unchecked") public static  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"); 
 if (method.getName().matches("set[AZ].*") { method.invoke(person,salary) // and so on } 

要知道参数,你可以根据结果构造你的参数和供应method.getPagetParameterTypes()发出method.getPagetParameterTypes()

要更新名字

  • 首先找到要更新的字段
  • 然后找到mutator(接受字段类型的参数)
  • 最后使用新值在对象上执行mutator:
 Field field=classHandle.getDeclaredField("firstName"); Method setter=classHandle.getMethod("setFirstName", field.getType()); setter.invoke(myObject, "new value for first name"); 
 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> entrySet = json.entrySet(); for (Entry 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)); } } }