方案
我有一个字符串列表,类似于一个类的类变量的名称。所以现在我必须使用列表为这些变量设置值。
示例
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()
获取变量列表。但之后如何设置这些值。
答案 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());