62,614
社区成员
发帖
与我相关
我的任务
分享
BtqcPcVO vo = new BtqcPcVO();
Class cls = vo.getClass();
Field[] fields = cls.getDeclaredFields();
StringBuffer sb = new StringBuffer();
System.out.println("StringBuffer sb = new StringBuffer();");
System.out.println("sb.append(\"{\");");
String name = null;
for(Field field:fields){
name = field.getName();
sb.append("sb.append(\"").append(name).append("\").append(").append("\":'").append("\").append(").append(name).append(").append(").append("\"',\");\n");
}
sb.append("sb.deleteCharAt(sb.length()-1);\n");
sb.append("sb.append(\"}\");");
System.out.println(sb.toString());
System.out.println("return sb.toString();");
package net.blogjava.frankiegao123.bean;
import java.util.Date;
import net.blogjava.frankiegao123.bean.annotation.BeanDate;
import net.blogjava.frankiegao123.bean.annotation.BeanDateType;
public class Test {
public static void main(String[] args) {
Student stu1 = new Student(1, "张三", new Date(), true);
Student stu2 = new Student(2, "王娟", new Date(), false);
System.out.println(stu1);
System.out.println(stu2);
}
}
class Student {
private int snum;
private String name;
private Date birthday;
private boolean male;
public Student(int snum, String name, Date birthday, boolean male) {
this.snum = snum;
this.name = name;
this.birthday = birthday;
this.male = male;
}
public int getSnum() {
return snum;
}
public void setSnum(int snum) {
this.snum = snum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@BeanDate(BeanDateType.DATE)
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public boolean isMale() {
return male;
}
public void setMale(boolean male) {
this.male = male;
}
public String toString() {
return BeanBuilder.buildString(this);
}
}
package net.blogjava.frankiegao123.bean.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* BeanBuilder 构造 toString 时日期的输出格式<br />
* NOTE: 标注于 get 方法上
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BeanDate {
BeanDateType value() default BeanDateType.TIMESTAMP;
}
package net.blogjava.frankiegao123.bean.annotation;
/**
* 产生 toString 的日期格式
*/
public enum BeanDateType {
// 仅有日期
DATE,
// 仅有时间
TIME,
// 日期和时间
TIMESTAMP
}
package net.blogjava.frankiegao123.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Date;
import net.blogjava.frankiegao123.bean.annotation.BeanDate;
public class BeanBuilder {
/**
* 需要过滤(不输出)的属性名
*/
private final static String[] FILTER_PROPERTIES = { "class" };
/**
* 构建 JavaBean 的 toString 方法
* @param target
* @return
*/
public static String buildString(Object target) {
if(target == null) {
return null;
}
PropertyDescriptor[] pds = getBeanProperties(target);
return processProperties(target, pds);
}
/**
* 获得 JavaBean 所有的属性描述
* @param target
* @return
*/
private static PropertyDescriptor[] getBeanProperties(Object target) {
PropertyDescriptor[] pds = new PropertyDescriptor[0];
try {
BeanInfo beanInfo = Introspector.getBeanInfo(target.getClass());
pds = beanInfo.getPropertyDescriptors();
} catch (IntrospectionException e) {
e.printStackTrace();
}
return pds;
}
/**
* 处理 JavaBean 中所有的属性描述
* @param target
* @param pds
* @return
*/
private static String processProperties(Object target, PropertyDescriptor[] pds) {
StringBuilder sb = new StringBuilder();
for(int i = 0, k = 0; i < pds.length; i++) {
if(isFilterProperty(pds[i])) {
continue;
}
if(k++ > 0) {
sb.append(", ");
}
processProperty(target, pds[i], sb);
}
return sb.toString();
}
/**
* 属性是否需要构建到 toString 方法中
* @param pd
* @return
*/
private static boolean isFilterProperty(PropertyDescriptor pd) {
String propertyName = pd.getName();
for(int i = 0; i < FILTER_PROPERTIES.length; i++) {
if(FILTER_PROPERTIES[i].equals(propertyName)) {
return true;
}
}
return false;
}
/**
* 生成某一属性和属性值(属性值通过 get 方法调用)
* @param target
* @param pd
* @param sb
*/
private static void processProperty(Object target, PropertyDescriptor pd, StringBuilder sb) {
sb.append(pd.getName()).append(" = ");
Method method = pd.getReadMethod();
if(method == null) {
// 没有找到 get 方法时直接返回 [UNKNOW]
sb.append("[UNKNOW]");
return;
}
Object obj = null;
try {
obj = method.invoke(target);
} catch (Exception e) {
e.printStackTrace();
}
if(obj == null) {
sb.append("null");
return;
}
objectString(obj, method, sb);
}
/**
* 将调用 get 方法返回的对象转为字符串
* @param obj
* @param sb
*/
private static void objectString(Object obj, Method getterMethod, StringBuilder sb) {
if(obj instanceof Date) {
BeanDate beanDate = getterMethod.getAnnotation(BeanDate.class);
DateBeanBuilder dateBuilder = (beanDate == null) ?
DateBeanBuilder.TIMESTAMP :
DateBeanBuilder.findDateFormat(beanDate.value());
sb.append(dateBuilder.formatDate((Date)obj));
return;
}
sb.append(String.valueOf(obj));
}
}
package net.blogjava.frankiegao123.bean;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.blogjava.frankiegao123.bean.annotation.BeanDateType;
/**
* 构建 toString 时处理日期类型的数据
*/
abstract class DateBeanBuilder {
private final static DateFormat DATE_FORMAT_TIMESTAMP = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private final static DateFormat DATE_FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd");
private final static DateFormat DATE_FORMAT_TIME = new SimpleDateFormat("HH:mm:ss");
private static Map<BeanDateType, DateBeanBuilder> container = new HashMap<BeanDateType, DateBeanBuilder>();
private DateBeanBuilder(BeanDateType beanDateType) {
register(beanDateType);
}
public final static DateBeanBuilder DATE = new DateBeanBuilder(BeanDateType.DATE) {
@Override
public String formatDate(Date date) {
return DATE_FORMAT_DATE.format(date);
}
};
public final static DateBeanBuilder TIME = new DateBeanBuilder(BeanDateType.TIME) {
@Override
public String formatDate(Date date) {
return DATE_FORMAT_TIME.format(date);
}
};
public final static DateBeanBuilder TIMESTAMP = new DateBeanBuilder(BeanDateType.TIMESTAMP) {
@Override
public String formatDate(Date date) {
return DATE_FORMAT_TIMESTAMP.format(date);
}
};
private void register(BeanDateType beanDateType) {
container.put(beanDateType, this);
}
public static DateBeanBuilder findDateFormat(BeanDateType beanDateType) {
return container.get(beanDateType);
}
public abstract String formatDate(Date date);
}