将值设置为名称与字符串数据匹配的类变量

时间:2015-02-18 10:01:19

标签: java class

方案

我有一个字符串列表,类似于一个类的类变量的名称。所以现在我必须使用列表为这些变量设置值。

示例

class Abc {
 private String name;
 private String Id;
 private String sal;
}

public static void main(String args[]){
Map<String,String> variablesMap = new HashMap<String,String>();
variablesMap.add("name","Joshi");
variablesMap.add("id","101");

/*Here i want to write the code to set the values for those variables*/
}

试过

ABC包含所有getter和setter。 使用java.lang.Field类我可以通过ABC.class.getDeclaredFileds()获取变量列表。但之后如何设置这些值。

5 个答案:

答案 0 :(得分:1)

您可以通过Field

获取指定姓名的Field field = getClass().getDeclaredField(name);

然后看看Java Docs:Field Documentation 您可以根据数据类型设置多个变量值。

看一下这个例子:编辑:更新以满足您的确切问题

import java.lang.reflect.Field;
import java.util.Map;
import java.util.HashMap;

public class FieldTest {

    String name;
    String id;


    public static void main(String[] args) {
        new FieldTest();
    }

    public FieldTest() {
    Map<String,String> variablesMap = new HashMap<String,String>();
    variablesMap.put("name","Joshi");
    variablesMap.put("id","101");

    for (Map.Entry<String, String> entry : variablesMap.entrySet())
    {
        try {
        test(entry.getKey(),entry.getValue());
        }
        catch(NoSuchFieldException ex) {
            ex.printStackTrace();
        }
        catch(IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    System.out.println(name);
    System.out.println(id);
    }

    private void test(String name, String value) throws NoSuchFieldException, IllegalAccessException {
        Field field = getClass().getDeclaredField(name);
        field.set(this,value);
    }

}

答案 1 :(得分:1)

你需要使用反射。 说变量&#39; name&#39;你在ABC类中有一个getName()方法。

所以, 通过迭代变量映射来创建方法名称。 然后在字符串中获取方法名称,

String nameMethod = "getName";
Object obj=null;
try 
{
  method = getClass().getMethod(nameMethod);
  obj= method.invoke(this);//if blank then method return null for integer and date column
}
catch(NoSuchMethodException e) {

}

您无法使用此代码段,需要进行一些修改

答案 2 :(得分:1)

您需要使用反射来设置字段的值。

一种选择是使用字段的set()方法:

getClass().getDeclaredField(myFieldName).set(myObject, myValue);

如果要使用setter方法设置值,则需要生成方法的名称。并使用invoke()设置值:

String methodName = "set" + myFieldName.subString(0, 1).toUpperCase() + myFieldName.subString(1);
Method method = getClass().getMethod(methodName, String.class);
method.invoke(myObject, myValue);

答案 3 :(得分:0)

        //abc is instance of class ABC
        BeanInfo info = Introspector.getBeanInfo(abc.getClass(),Object.class);
        PropertyDescriptor[] props1 = info.getPropertyDescriptors();
        for (PropertyDescriptor pd : props1) {
            String name = pd.getName();
            String arg1 = variablesMap.get(name);
            Method setter = pd.getWriteMethod();
            setter.invoke(abc, arg1);
        }

答案 4 :(得分:0)

您必须告诉Field哪个实例设置值:

ABC abc = new ABC();
for (Map.Entry<String, String> entry : variablesMap.entrySet())
    ABC.class.getDeclaredField(entry.getKey()).set(abc, entry.getValue());