开发者社区 问答 正文

java反射如何调用参数为int的方法?

代码如下,会发生java.lang.NoSuchMethodException异常。

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);       
    }
}

展开
收起
蛮大人123 2016-03-12 15:39:22 3180 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    1.写全类名(eg):cls = Class.forName("org.plyy.sf.q1010000005052682.MyClass");
    2.类型用包装类型:intField 使用Integer类型代替int(补充:用了第三条后这条就不用了,还是要自己试)
    3.推荐:f.getType()代替fieldValue.getClass()

    2019-07-17 19:01:04
    赞同 展开评论
问答分类:
问答地址: