Java反射设置器

Java反射设置器,java,reflection,Java,Reflection,我试图通过使用java反射来设置类成员变量的值,但在方法调用期间,它将停止,并且不会引发任何异常或错误。真烦人我被困在这里请帮帮我。。。。。。。。。。。。。。。。。。。。 这是我的密码 public class SMapper { public void SetMapforvalues(Hashtable obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, No

我试图通过使用java反射来设置类成员变量的值,但在方法调用期间,它将停止,并且不会引发任何异常或错误。真烦人我被困在这里请帮帮我。。。。。。。。。。。。。。。。。。。。 这是我的密码

public class SMapper {

    public void SetMapforvalues(Hashtable obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {

        Field[] fields = this.getClass().getDeclaredFields();

        for (Field field : fields) {

            String fieldName = field.getName();
            Object value = obj.get(fieldName);

            if (value != null) {

                Class<?> type = field.getClass();

                if (type.equals(Integer.class)) {
                    Integer data = (Integer)value;
                    field.set(this, data);       

                } else if (type.equals(String.class)) {
                    String data = (String)value;                    
                    field.set(this, data);
                } else if (type.equals(Double.class)) {
                    Double data = (Double) value;
                    field.set(this, data);       
                } else {

                    Method method = type.getMethod("SetMapforvalues");
                    Object methodreturn = method.invoke(value, obj);                  

                }
            }

        }

    }

}
公共类SMapper{
public void SetMapforvalues(Hashtable obj)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException、NoSuchMethodException{
Field[]fields=this.getClass().getDeclaredFields();
用于(字段:字段){
字符串fieldName=field.getName();
对象值=对象获取(字段名);
if(值!=null){
类类型=field.getClass();
if(type.equals(Integer.class)){
整数数据=(整数)值;
字段.set(此字段为数据);
}else if(type.equals(String.class)){
字符串数据=(字符串)值;
字段.set(此字段为数据);
}else if(type.equals(Double.class)){
双数据=(双)值;
字段.set(此字段为数据);
}否则{
Method=type.getMethod(“SetMapforvalues”);
objectmethodreturn=method.invoke(值,obj);
}
}
}
}
}

问题出在这一行:

Field[] fields = this.getClass().getDeclaredFields();

您得到的是
SMapper
类的声明字段,我怀疑这不是您想要做的。该类没有声明的字段,因此数组为空,并且永远不会输入for循环。

如果调用此方法,它应该可以工作(如果@MrWiggles指出它在类中没有字段,则它不会做任何事情),或者产生一个错误,您可能会忽略该错误

最好的方法是在调试器中逐步检查代码,或者您可以尝试捕获所有代码并将其打印到您将看到的地方

i、 e


getDeclaredFields不会为超类提供任何字段。实际上,我是从另一个从SMapper继承的类X对象调用此函数,因此它将获得X类的字段,但在循环完成后,它不会调用Y类对象的方法,该对象在X类中声明,并且X和Y都是继承的使用Spring的ReflectionUtils.doWithFields()方法
public void SetMapforvalues(Hashtable obj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    try {
        Field[] fields = this.getClass().getDeclaredFields();
        System.out.println(Arrays.toString(fields));
        // your code here
    } catch (Throwable t) {
        t.printStackTrace();
    }