代码如下,会发生java.lang.NoSuchMethodException异常。
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
class MyClass{
public int intField;
public String strField;
public MyClass(){
}
public int getIntField() {
return intField;
}
public void setIntField(int intField) {
this.intField = intField;
}
public String getStrField() {
return strField;
}
public void setStrField(String strField) {
this.strField = strField;
}
@Override
public String toString() {
return intField + " " + strField;
}
}
public class TestReflection {
public static void main(String[] args) {
Class cls = null;
try {
cls = Class.forName("MyClass");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Object obj = null;
try {
obj = cls.newInstance();
} catch (InstantiationException | IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Field fs[] = cls.getFields();//获取所有public的属性
Map<String, Object> map = new HashMap<>();
map.put("intField", 10);
map.put("strField", "memeda");
for(Field f:fs){
String fieldName = f.getName();//得到该属性名
Object fieldValue = map.get(fieldName);//得到属性值
String methodName = "set"+ fieldName.substring(0, 1).toUpperCase() +
fieldName.substring(1);
System.out.println(methodName);
try {
Method method = cls.getMethod(methodName, fieldValue.getClass());
method.invoke(obj, fieldValue);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(obj);
}
}
写全类名(eg):
cls = Class.forName("org.plyy.sf.q1010000005052682.MyClass");
类型用包装类型:
intField
使用Integer
类型代替int
(补充:用了第三条后这条就不用了,还是要自己试)推荐:
f.getType()
代替fieldValue.getClass()