1

私はクラス名(文字列)を取得しており、クラスにはsetsメソッドがほとんどなく、その動的(任意のクラスを取得できます)なので、すべてのsetsメソッドを使用して data で更新する必要があります。どうやってやるの ?

クラスフィールドを取得するには、次のコードを使用しています

className = obj.getClassName();
Class<?> classHandle = Class.forName(className);

たとえば、ここでは firstName と last name を更新する必要があります

public class Person {

private String id;
    private String firstName;
    private String lastName;

    public void setLastName(String lastName) {

        this.lastName = lastName;
    }

    public void setfirstName(String firstName) {

        this.firstName = firstName;
    }

またはここで別のクラス 給与と職務内容を設定する必要があります

public class Job {


  private double salery;
  private String jobDescr;


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

  public void setJobDescr(String jobDescr) {
    this.jobDescr = jobDescr;
  }

}
4

1 に答える 1

2

手始めに、あなたがしたことは良いことです。Map<String, Object>設定する属性がいくつかあると思いますattributeMap

//this is OK
className = obj.getClassName();
Class<?> classHandle = Class.forName(className);

//got the class, create an instance - no-args constructor needed!
Object myObject = classHandle.newInstance();

//iterate through all the methods declared by the class  
for(Method method : classHandle.getMethods()) {
   //check method name
   if(method.getName().matches("set[A-Z].*") 
       //check if it awaits for exactly one parameter
       && method.getParameterTypes().length==1) {

       String attributeName = getAttributeName(method.getName());
       //getAttributeName would chop the "set", and lowercase the first char of the name of the method (left out for clarity)

       //To be extra nice, type checks could be inserted here...
       method.invoke(myObject, attributeMap.get(attributeName));            

   }
}

もちろん、多くの例外処理を行う必要があります。これは、何を行うかについての基本的な考え方にすぎません...

推奨読書:

于 2013-01-16T15:17:27.123 に答える