您的位置:首页 > 编程语言 > Java开发

通过反射将对象的属性拼接成为字符串

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 对象 反射