java代码: |
public static void main(String[] args) throws Exception { System.out.println(isWrapClass(Long.class)); System.out.println(isWrapClass(String.class)); } public static boolean isWrapClass(Class clz) { try { return ((Class) clz.getField("TYPE").get(null)).isPrimitive(); } catch (Exception e) { return false; } } |
java代码: |
import java.lang.reflect.Constructor; import java.lang.reflect.Field; /** * 防止一个持久化实体对象实例的属性中出现null的工具类 * @author wuyongwei * */ public class PreventNullUtil { /** * 利用反射把对象实例的为null的自定义数据类型属性设置为非null,对java.lang和java.util下的java自带数据类型不起作用 * <br>因为使用了反射和递归,应谨慎使用 * @param obj 需要防止出现null属性的对象实例 */ public static void preventNull(Object obj) { Class objClass = obj.getClass(); for (int i = 0; i < objClass.getDeclaredFields().length; i++) { boolean accessible = false; Field field = objClass.getDeclaredFields()[i]; accessible = field.isAccessible(); Class fieldType = field.getType(); Object fieldValue = null; Constructor[] constructors; //如果是基本类型,跳过 if (fieldType.isPrimitive()) { continue; } // 如果是lang包或者util包下面的类,可以跳过 // 这里不严谨,不过对于实体而言可以接受, // 因为实体的属性一般不是这两个包下面的¾褪Ç自定义的包 if (fieldType.getPackage().getName().equals("java.lang")) { continue; } if (fieldType.getPackage().getName().equals("java.util")) { continue; } System.out.println("处理属性:" + field.getName()); if (accessible == false){ field.setAccessible(true); } try { fieldValue = field.get(obj); } catch (Exception e) { // TODO: handle exception,这里要不要抛出异常? System.err.println("无法读取属性 " + field.getName() + " 的值,错误:" + e.getMessage()); e.printStackTrace(); } if (fieldValue == null) { constructors = fieldType.getConstructors(); for (int j = 0; j < constructors.length; j++) { Constructor constructor = constructors[j]; // 只有空构造器才可以方便动态新建实例 if (constructor.getParameterTypes().length==0) { try { Object newValue = fieldType.newInstance(); field.set(obj,newValue); System.out.println("属性设置成功:" + field.getName()); //»挂ª防止新建的这个实例的属性如果是自定义类型的话可能存在的null值,递归调用 preventNull(newValue); System.out.println("属性递归设置成功:" + field.getName()); break; }catch (Exception e) { // TODO: handle exception,这里要不要抛出异常? System.err.println("设置属性 '" + field.getName() + "' 出错,错误:" + e.getMessage()); e.printStackTrace(); break; } } } } System.out.println("处理属性结束:" + field.getName() ); field.setAccessible(accessible); } } } |