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

查看:137
本文介绍了java反射如何调用参数为int的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

代码如下,会发生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);
        
    }

}

解决方案

  1. 写全类名(eg):cls = Class.forName("org.plyy.sf.q1010000005052682.MyClass");

  2. 类型用包装类型:intField 使用Integer类型代替int(补充:用了第三条后这条就不用了,还是要自己试)

  3. 推荐:f.getType()代替fieldValue.getClass()

这篇关于java反射如何调用参数为int的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆