为了解决某个问题,需要把对象的非基本数据类型,如自定义的一些类型,如在我的包:com.shutao.test下面的,和一些java.util.Set类型的设置为NULL,这里写了个通用类,包括调用自己的和父类的setter方法,大家可参考参考:
/**
* 调用对象的setter方法,将非基本数据类型统一设置为null值
* @author linshutao
* */
public static void setFieldToNull(Object o) {
//获取自己的属性
Field[] fields1=o.getClass().getDeclaredFields();
//获得父类的属性
Field[] fields2=o.getClass().getSuperclass().getDeclaredFields();
//合并所有属性
Field[] fields = new Field[fields1.length+fields2.length];
for(int i=0;i<fields1.length;++i){
fields[i] = fields1[i];
}
for(int j=0;j<fields2.length;++j){
fields[fields1.length+j] = fields2[j];
}
for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName(); //属性名称
String filedType = fields[i].getType().toString(); //属性类型
//去掉前面的class啊inteface啊这些说明
filedType = filedType.substring(filedType.indexOf(" ")+1);
//如果是我自定义的类型的
if(filedType.indexOf("com.shutao.test")!=-1 ||
filedType.indexOf("Set")!=-1){
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//得到方法名称
String setter = "set" + firstLetter + fieldName.substring(1);
try {
//先调用自身的方法
Method callMethod = o.getClass().getMethod(setter, Class.forName(filedType));
callMethod.invoke(o, new Object[] {null});
} catch (Exception e) {
try {
//上面调用自身的方法如果调不到会抛异常,这里再调用父类的方法
Method callMethod = o.getClass().getSuperclass().getDeclaredMethod(setter,Class.forName(filedType));
callMethod.invoke(o, new Object[] {null});
} catch (Exception e1) {
log.error(e1.getMessage(),e1);
}
}
}
}
}
另外有个地方为了避免set集合因lazy=true而引起的懒加载异常,需要统一进行实例话,与是写了下面这个方法:
/**
* 调用对象的Set类型的getter方法,可用于实例化集合,避免hibernate的lazy引起的异常
* @author linshutao
* */
public static void callGetMethodForSetField(Object o) {
Field[] fields = getFieldsIncludeParent(o);
for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName(); //属性名称
String filedType = fields[i].getType().toString(); //属性类型
//去掉前面的class啊inteface啊这些说明
filedType = filedType.substring(filedType.indexOf(" ")+1);
//如果是Set类型的
if(filedType.indexOf("Set")!=-1){
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//得到方法名称
String method = "get" + firstLetter + fieldName.substring(1);
try {
//先调用自身的方法
Method callMethod = o.getClass().getMethod(method, new Class[] {});
//调用set的size用于实例化
Set set = (Set)callMethod.invoke(o, new Object[] {});
set.size();
} catch (Exception e) {
try {
//上面调用自身的方法如果调不到会抛异常,这里再调用父类的方法
Method callMethod = o.getClass().getSuperclass().getDeclaredMethod(method,new Class[] {});
Set set = (Set) callMethod.invoke(o, new Object[] {});
set.size();
} catch (Exception e1) {
log.error(e1.getMessage(),e1);
}
}
}
}
}
分享到:
相关推荐
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
前言: 近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,... JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方
其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管...
Java反射机制是在运行状态中,对于任意类,都能够知道这个类的属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象的方式称为Java语言的反射机制。简单来说,反射机制指...
outputMax.java 求两个数中的最大数 overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java ...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
一、Spring简介 1. 概述 ...工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,通过工厂加载产生需要的类对象。 ② AoP(Aspect Oriented Programing) --> 面向切面编程
1、完成“6.5.1枚举基础和应用”中【3、星期枚举类——能给出“星期几”和“周几”的版本】的两个空。 ⑴答:zhou="周"+xq.charAt(2); ⑵答:weeks.getzhou() 2、结合实验专题6的“6.5.6泛型基础”中【1、泛型与集合...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
*第八阶段:JavaScript脚本语言,包括javaScript语法和对象,就这两个方面的内容; *第九阶段:DOM编程,包括DOM原理,常用的DOM元素以及比较重要的DOM编程思想; *第十阶段:Servlet开发,从此开始踏入java...
15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...
反射机制可认为是用来描述一组类--------可以与File对比着学习 反射的实际应用: String----类---实例化成对象 设计一个方法,给一个字符串(类)返回一个对象,对象里面还有属性值 例如考试系统中 Question类型 ...
ActiveX数据对象,是一个应用级程序接口. 75.四种JDBC方式?目前的版本? 76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何...