我有个需求需要在操作bean时要先去除所有的默认值。
那我通过反射来获取每个字段的set方法,然后再反射给null代码如下:public static void removeAllDefaultValue(Object o) throws Exception{
Class clazz = o.getClass();
Field [] fs = clazz.getDeclaredFields();
Method[] m = clazz.getMethods();
BeanInfo beanInfo = Introspector.getBeanInfo(o.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(Field f : fs){
Class typec = f.getType();
String typename = typec.getName();
switch(typename){
case "java.lang.Long":
case "java.lang.Integer":
case "java.lang.Byte":
case "java.lang.Float":
case "java.lang.Double":
case "java.lang.Boolean":
case "java.lang.String":
case "java.util.Date":
for(PropertyDescriptor p : pds){
String name =p.getName();
if(f.getName().toUpperCase().equals(name.toUpperCase())){
Method m1 = p.getWriteMethod();
m1.invoke(o, null);
break;
}
}
}
}
}
但是实际运行效果就是:Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.test.ReflectUtil.removeAllDefaultValue(ReflectUtil.java:44)
at com.test.ReflectUtil.main(ReflectUtil.java:112)
经过查询资料和分析后发现,并不能直接给null,否则会认为没有给值。
那这就难办了呀。
所以只能这么做了:if(f.getName().toUpperCase().equals(name.toUpperCase())){
Method m1 = p.getWriteMethod();
Object defaultValue = null;
m1.invoke(o, defaultValue);
break;
}