通过反射将对象的属性拼接成为字符串
2014-02-22 09:56
323 查看
/** * @return 返回指定类型sql 的局部;(update|insert)。 * @param entity 实体对象 *@param attrandfields 数组;三维数组。如:String[][] attrandfields={{attr1,attr2,attr3},{field1,field2,field3},{"","",""}} *@param sqltype=1[insert]|2[update] * */ public static String getSqlPart(Object entity,String[][] attrandfields,int sqltype ) throws Exception{ attrandfields=getProperty(entity,attrandfields); if(sqltype==1){ String fields="",values=""; for(int i=0;i<attrandfields[0].length;i++){ if(attrandfields[2][i]==null)continue; fields+=","+attrandfields[1][i]; values+=",'"+attrandfields[2][i]+"'"; } if(fields.startsWith(",")){fields=fields.substring(1);values=values.substring(1);} return "("+fields+") values("+values+")"; }else if(sqltype==2){ String fieldandvalue=""; for(int i=0;i<attrandfields[0].length;i++){ if(attrandfields[2][i]==null)continue; fieldandvalue+=","+attrandfields[1][i]+"='"+attrandfields[2][i]+"'"; } if(fieldandvalue.startsWith(",")){fieldandvalue=fieldandvalue.substring(1);} return fieldandvalue+" "; } return null; } /** * 用排除字段法,这里假设实体属性=字段名。 * 一般使用此方法,将不需要插入或更新的字段组成数组,传入此方法。 * 1为插入,2为更新。 * */ public static String getSqlPart(Object entity,String[] noattr,int sqltype ) throws Exception{ String fields=""; Class clazz = entity.getClass(); Field field[] = clazz.getDeclaredFields(); for (Field f : field) { int idx=isTableField(f,noattr); if(idx!=-1){continue;} fields+=","+f.getName(); } if(fields.startsWith(","))fields=fields.substring(1); String[] attr=fields.split(","); String[][] attrandfields=new String[3][attr.length];//{{attr.split(",")},{attr.split(",")},{attr.split(",")}; attrandfields[0]=attrandfields[1]=attr; return getSqlPart( entity, attrandfields, sqltype ); } /** * @return 返回指定实体,指定属性的值,如果不存在则为null。 * */ public static String[][] getProperty(Object entity,String[][] attrandfields) throws Exception { Class clazz = entity.getClass(); Field field[] = clazz.getDeclaredFields(); for (Field f : field) { int idx=isTableField(f,attrandfields[0]); if(idx==-1){continue;} boolean accessFlag = f.isAccessible(); f.setAccessible(true);// 修改访问控制权限 Object v =f.get(entity);// invokeMethod(entity, f.getName(), null); f.setAccessible(accessFlag);// 恢复访问控制权限 //System.out.println(f.getName() + "\t" + v + "\t" + f.getType()); attrandfields[2][idx]=(v!=null)?v.toString():null; } return attrandfields; } /** * 此方法根据传入的属性,定位其在数组中的位置。并传回为value定位准备。 * @param f * @param attrs * @return */ private static int isTableField(Field f,String[]attrs){ for(int i=0;i<attrs.length;i++){ if(attrs[i].trim().equalsIgnoreCase(f.getName())){return i;} } return -1; } /**这是将传入的实体,以及要获取get方法的属性传入。通过转换首字母大小写,进行获取。 * @param entity * @param fieldname * @param args * @return * @throws Exception */ private static Object invokeMethod(Object entity, String fieldname, Object[] args) throws Exception { Class clazz = entity.getClass(); fieldname = fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1); Method method = null; try { method = clazz.getMethod("get" + fieldname); } catch (SecurityException e) { } catch (NoSuchMethodException e) { return " can't find 'get" + fieldname + "' method"; } return method.invoke(entity); } ////////////////////// public static void main(String[] args) { New nue=new New(); nue.setMake_man("zxy"); nue.setNew_id("1111"); nue.setMake_time("2011-12-12"); nue.setMake_dpt_code("10506"); String[] attr=" New_id,new_no,new_org_code,new_date,new_man,description,asset_org_code, make_dpt_code ,Make_man,make_time,confirm_date,status".split(","); //String field=" New_id,new_no,new_org_code,new_date,new_man,description,asset_org_code,make_dpt_code1,make_man,make_time,confirm_date,status"; String[][] attrandfield=new String[3][attr.length];//{{attr.split(",")},{attr.split(",")},{attr.split(",")}; attrandfield[0]=attrandfield[1]=attr; try { String sqlpart=Util.getSqlPart(nue,attrandfield,1); System.out.println("insert into dtms_doc_new "+sqlpart); sqlpart=Util.getSqlPart(nue,new String[]{"serialVersionUID"},1); System.out.println("!--insert into dtms_doc_new "+sqlpart); sqlpart=Util.getSqlPart(nue,attrandfield,2); System.out.println("update dtms_doc_new set "+sqlpart+" where New_id=1"); sqlpart=Util.getSqlPart(nue,new String[]{"serialVersionUID"},2); System.out.println("!--update dtms_doc_new set "+sqlpart+" where New_id=1"); } catch (Exception e) { e.printStackTrace(); } }
相关文章推荐
- 【json】前台ajax序列化的多个属性拼接在一起的字符串,转化为JSONObject对象
- 随机让对象中的属性赋值,不通过过判断(通过反射)
- 通过反射取得对象中的属性列表及值
- 笔记:javascript通过反射和遍历,访问对象的所有属性,及 按引用/按值传递
- 通过反射创建私有化类的对象,调用类的私有方法,改变私有属性
- js中input的属性设置问题(变量设置,字符串拼接,通过函数设置)
- java通过反射设置对象私有属性
- iOS 将对象的属性和属性值拆分成key、value,通过字符串key来获取该属性的值
- java反射技术通过对象和属性名得到属性值
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
- Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值
- PropertyInfo 类: 通过将对象反射,从而获取此对象所有属性,及对应的值
- 6.通过反射动态创建对象,获取属性,获取方法
- Java中通过注解+反射拿到对象的属性和方法
- Java通过反射机制动态设置对象属性值
- Java中通过反射获得对象的属性信息
- Java通过反射机制动态设置对象属性值的方法
- java通过反射给对象设置属性【工具包系列】
- 通过反射生成JSON字符串,以及解析JSON字符串到对象
- 代码 - 通过反射对象属性进行遍历赋值