代码如下,会发生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);
2 回答
![?](http://img1.sycdn.imooc.com/5333a0aa000121d702000200-100-100.jpg)
SMILET
TA贡献1796条经验 获得超4个赞
对于原始类型,使用反射需注意:
原始类型对应的虚拟机中的class实例和封装类对应的class实例是不相同的。
如:int
对应的class实例为 int.class
或者 Integer.TYPE
,但是 Integer 对应的 class 实例为 Integer.class
因此,你的代码中要通过反射执行 setIntField(int)时,需要通过以下方式获取 method:
Method method= cls.getMethod("setIntField", int.class);
添加回答
举报
0/150
提交
取消