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 ); } } } |