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