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

最近做到项目需要将对象的所有属性中文名及对应的值在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;
  } 
    
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值