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

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()


对于原始类型,使用反射需注意:

原始类型对应的虚拟机中的class实例和封装类对应的class实例是不相同的。

如:
int 对应的class实例为 int.class 或者 Integer.TYPE,但是 Integer 对应的 class 实例为 Integer.class

因此,你的代码中要通过反射执行 setIntField(int)时,需要通过以下方式获取 method:

Method method= cls.getMethod("setIntField", int.class);
【热门文章】
【热门文章】