2013-01-17 171 views
19

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

回答

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

知道你可以根据结果构建你的参数和供应的问题method.getPagetParameterTypes() 的参数。

+0

的问题是,(我认为)如何确定要发送的参数 - 如何定义当前的'method'对象是否期望double或String,并在确定之后 - 如何知道要发送给方法的内容。 – amit

+0

奇怪的假设,因为这个问题中没有提到这种类型。 –

49

而不是试图调用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> 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"); 
+0

感谢您的回放,这里的问题是我不知道薪水和名字,因为每次我可以获得不同的课程,因此我可以使用set(myObject,“salery”,15)等类似的东西。 –

+0

@StefanStrooves那么你怎么知道你应该在哪个课上设置哪个领域? – sp00m

+0

我需要用dummy数据更新所有set方法 –

1

要更新的第一个名字

  • 首先找到你想更新
  • 然后找到突变(它接受该字段的类型的参数)
  • 最后执行与对象上的突变场新值:
Field field=classHandle.getDeclaredField("firstName"); 
Method setter=classHandle.getMethod("setFirstName", field.getType()); 
setter.invoke(myObject, "new value for first name"); 
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("[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)); 
    } 

    } 

}