通过自定义元注释将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;
}
}
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;
}
}
相关文章推荐
- 使用ToStringBuilder输出对象所有属性以及对应的值-java笔记
- List<T>集合导出csv方法参考,通过增加自定义的属性控制输出的字段。
- Java循环一个对象的所有属性,并通过反射给这些属性赋值/取值
- Java(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
- C#通过反射获取对象属性,打印所有字段属性的值
- Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
- 如何通过mat从java内存dump中找到缓存对象中的所有字符串
- 用Java反射输出对象的所有属性的值
- java list按照元素对象的指定多个字段属性进行排序
- windows下eclipse工程转到linux下源代码注释以及输出字符串中中文乱码解决方法
- 微信自定义菜单,php配置一个多维数组,通过json_encode()生成json字符串,中文会转为\uxxxx,微信报错!
- C# 自定义类型通过实现IFormattable接口,来输出指定的格式和语言文化的字符串(例:DateTime)
- java 关于中文字的输出 输入 和文件操作(对象序列化)
- 自定义对象属性为空自动转换为字符串
- java之通过反射,来获得某对象的所有方法(类方法提取器)
- 使用java反射技术完成对象所有属性值的输出
- PropertyInfo 类: 通过将对象反射,从而获取此对象所有属性,及对应的值
- C#中通过一个对象,得到属性(字符串形式)的值
- 【Java笔试题】输出字符串的所有组合
- 通过java反射机制,获取对象的属性和值(包括所有继承的父类)