reflexion recorrer principio objetos objeto method atributos java reflection accessor

recorrer - reflection java 8



Usando la reflexión para establecer una propiedad de objeto (4)

Recibo clase por nombre y necesito actualizarlos con datos respectivos y mi pregunta es cómo hacerlo con java. Quiero agregar al método algunos datos ficticios. No sé el tipo de clase, solo obtengo el nombre de la clase y uso la reflexión para obtener sus datos

Yo uso este código para obtener la instancia de clase y

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

Y sepa que encuentro la lista del método de configuración que deseo actualizar con datos. ¿Cómo puedo hacer eso?

Supongamos que en nombre de clase tengo persona y la clase tiene setSalary y setFirstName, etc. ¿Cómo puedo establecerlos con reflexión?

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


En lugar de intentar llamar a un definidor, también puede establecer directamente el valor de la propiedad mediante la reflexión. Por ejemplo:

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

Llamada:

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

Para su información, aquí está el getter genérico equivalente:

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

Llamada:

Class<?> clazz = Class.forName(className); Object instance = clazz.newInstance(); int salary = get(instance, "salary"); String firstname = get(instance, "firstname");


Para actualizar el primer nombre.

  • Primero encuentra el campo que quieres actualizar
  • Luego encuentra el mutador (que acepta un argumento del tipo de campo)
  • Finalmente ejecute el mutador en el objeto con el nuevo valor:

Field field=classHandle.getDeclaredField("firstName"); Method setter=classHandle.getMethod("setFirstName", field.getType()); setter.invoke(myObject, "new value for first name");


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

para conocer los parámetros puede emitir method.getPagetParameterTypes() función del resultado, construya sus parámetros y el suministro.


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