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

通过自定义元注释将java对象的所有属性以字符串“字段中文:值”输出

2014-01-16 17:35 1021 查看
最近做到项目需要将对象的所有属性中文名及对应的值在pdf中显示,一下是获取对象中文名及值得方法

1.定义自定义元注释

package com.isoftstone.mipss.common.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Documented

@Target({ElementType.TYPE,ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)@Inherited

public @interface Mark {

public String name()default"";//字段或类名称(只适用于非分组字段[即不需要说设置group属性])

public String group()default "";//分组名称(将字段分组,支持两个字段,一个字段的值为key一个字段的值为value;当此字段存在时不需要设置name)

public TYPE fieldType()default TYPE.KEY;//分组字段类型

public boolean showNull()default true;

public enum TYPE{KEY,VALUE};

public String unit()default"";//单位

}

2.在java对应实体类中添加注释

@Mark(name="通讯资料变更")

public class Item01 extends ItemCommon {

/**

*

*/

private static final long serialVersionUID = 1L;

private String Address_1 = "" ; // 通讯地址1

private String Address_2 = "" ; // 通讯地址2

private String Address_3 = "" ; // 通讯地址3

private String Address_4 = "" ; // 通讯地址4

private String Address_5 = "" ; // 通讯地址5

@Mark(name="邮政编码")

private String ZipCode = "" ; // 邮政编码

@Mark(name="家庭电话")

private String HomePhone = "" ; // 家庭电话

@Mark(name="办公电话")

private String CompanyPhone = "" ; // 办公电话

@Mark(name="移动电话")

private String Mobile = "" ; // 移动电话

@Mark(name="电子邮件")

private String Email = "" ; // 电子邮件

..................................get,set方法.................................

}

3.解析元注释获取所有字段属性

package com.isoftstone.mipss.converter;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import com.isoftstone.mipss.common.annotation.AppGroupVo;

import com.isoftstone.mipss.common.annotation.Mark;

import com.isoftstone.mipss.common.annotation.Mark.TYPE;

import com.isoftstone.mipss.entity.item.Item17;

import com.isoftstone.mipss.entity.item.Item17ExInvest;

public abstract class AppConvert {

public static void main(String[] args) {

Item01 item01= new Item01();

item01.setAddress("beijin");

AppConvert convert = new AppConvert() {};

try {

System.out.println(convert.loadfieldStr(item01));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public String loadfieldStr(Object obj)throws Exception {

StringBuffer str = new StringBuffer();

fieldload(obj,str);

return str.toString();

}

/**

* 读取对象中所有的字段并拼装成字符串

* @param obj

* @return

* @throws IllegalArgumentException

* @throws IllegalAccessException

*/

private StringBuffer fieldload(Object obj,StringBuffer linStr) throws Exception{

Field[]fields = obj.getClass().getDeclaredFields();

int index=1;//当前为第几个属性

Map<String,AppGroupVo> dataStrMap = new HashMap<String, AppGroupVo>();

for(Field field : fields){//获取变更项变更字段信息

Mark fildMark =(Mark)field.getAnnotation(Mark.class);//获取字段注释信息

if(fildMark==null){

continue;

}

field.setAccessible(true);

String fdclazz = field.getName();

String first = fdclazz.substring(0, 1).toUpperCase();

String end = fdclazz.substring(1,fdclazz.length());

Method mtd = obj.getClass().getDeclaredMethod("get"+first+end);

Object val = mtd.invoke(obj);

//Object val = field.get(obj);

if(!isBaseType4Java(field.getType())){//如果不是基础类型则需要获取类对象的属性

String fildStr = fildMark.name();//变更项显示文本为变更项名称和值

if(!"".equals(fildStr)){//如果对象name为空值则不显示名称

linStr.append(fildStr).append("【\n");

}

if(val!=null){

if(List.class.getName().equalsIgnoreCase(field.getType().getName())){//如果是数组则遍历数组

List objlist = (List)val;

for(int i=0;i<objlist.size();i++){

fieldload(objlist.get(i),linStr);

}

}else{

fieldload(val,linStr);

}

}

if(!"".equals(fildStr)){

linStr.append("】\n");

}

}else{//基础数据类型直接取值

val=val==null||"null".equalsIgnoreCase(val+"")?"":val;//如果值为null则设置为""

if(!"".equals(fildMark.group())){//如果存在分组则需要根据分组名设置AppGroupVo的key和value

if(dataStrMap.get(fildMark.group())==null){

AppGroupVo groupvo = new AppGroupVo();

dataStrMap.put(fildMark.group(), groupvo);

}

if(TYPE.KEY.equals(fildMark.fieldType())){

if(!"".equals(val)){

AppGroupVo groupvo = dataStrMap.get(fildMark.group());

groupvo.setFieldKey(val.toString());

groupvo.setShowNull(fildMark.showNull());

}

}else if(TYPE.VALUE.equals(fildMark.fieldType())){

AppGroupVo groupvo = dataStrMap.get(fildMark.group());

groupvo.setFieldVal(val.toString());

groupvo.setUnit(fildMark.unit());

}

}else{//如果不是分组字段则直接去字段名和字段值

AppGroupVo groupvo = new AppGroupVo();

groupvo.setFieldKey(fildMark.name());

groupvo.setFieldVal(val.toString());

groupvo.setShowNull(fildMark.showNull());

groupvo.setUnit(fildMark.unit());

dataStrMap.put("abcdefgss_"+index, groupvo);

}

index++;

Iterator<String> iterator = dataStrMap.keySet().iterator();

while(iterator.hasNext()){//循环数据列表并输出字段字符串

String key = iterator.next();

AppGroupVo groupvo = dataStrMap.get(key);

if(!groupvo.getShowNull()&&"".equals(groupvo.getFieldVal())){//如果设置为不显示空值

dataStrMap.remove(key);

}else{

if(groupvo.getFieldVal()!=null){//如果对应的key存在value则说明该group已经设置了value 则输出字符串

String fildStr = groupvo.getFieldKey().trim()+": "+groupvo.getFieldVal().trim()+groupvo.getUnit().trim();//变更项显示文本为变更项名称和值

linStr.append(fildStr).append("\n\n");

dataStrMap.remove(key);

}

}

}

}

}

return linStr;

}

/**

* 是否为基础数据类型

* @param obj

* @return

*/

public boolean isBaseType4Java(Class obj){

if(char.class.getName().equalsIgnoreCase(obj.getName())

||String.class.getName().equalsIgnoreCase(obj.getName())

||Byte.class.getName().equalsIgnoreCase(obj.getName())

||Short.class.getName().equalsIgnoreCase(obj.getName())

||Long.class.getName().equalsIgnoreCase(obj.getName())

||Integer.class.getName().equalsIgnoreCase(obj.getName())

||Float.class.getName().equalsIgnoreCase(obj.getName())

||Double.class.getName().equalsIgnoreCase(obj.getName())

||Boolean.class.getName().equalsIgnoreCase(obj.getName())

){

return true;

}

return false;

}

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