拼接字符串 急!!!!!!!!!

whatisj2ee 2009-08-22 07:01:06
有没有人会把一个java对象的所有的属性名和属性值拼成一个 字符串,如 "age=23 name=每个",帮帮忙
...全文
620 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotleavegjz 2009-08-27
  • 打赏
  • 举报
回复
呵呵, 下面是我原来写的一个拼json的方法(JObject, JArray有时不好用), 希望对楼主有帮助.
采用反射的方式, 直接把输出的代码写到toString()里就可以了.

另外还有一种方法就是写一个父类, 将父类的toString()方法改成下面的这种反射的形式. 这样调用子类的toString方法时将会读出所有的属性.

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();");
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
火龙果的代码还没看完,感觉这个东西应该用toString,要不编写这个类的人会被各种规则累死的
chenchengamao 2009-08-27
  • 打赏
  • 举报
回复
火龙果的代码是哪来的
  • 打赏
  • 举报
回复
火龙果的代码很强大。
qiubojuncode 2009-08-27
  • 打赏
  • 举报
回复
火龙果的代码太长了
铁匠梁老师 2009-08-27
  • 打赏
  • 举报
回复
直接重写对象的toString()方法。
fiwiner 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 baobao04551 的回复:]
杀鸡焉用牛刀!

toString()
[/Quote]
同意
Emerson_Li 2009-08-26
  • 打赏
  • 举报
回复
不错,上面火龙果的代码很优雅,很好。不过还用到了注解,可能对没学过注解的人有点难理解
junyun414 2009-08-23
  • 打赏
  • 举报
回复
老火,好像我也不会反射。
maojiang502 2009-08-23
  • 打赏
  • 举报
回复
火龙果, 真是个有心人。
Sonyer_520 2009-08-23
  • 打赏
  • 举报
回复
重写toString();
24K純帥 2009-08-23
  • 打赏
  • 举报
回复
火龙果很强大耶
java1109 2009-08-23
  • 打赏
  • 举报
回复
9楼高手
学习了
baobao04551 2009-08-22
  • 打赏
  • 举报
回复
杀鸡焉用牛刀!

toString()
  • 打赏
  • 举报
回复
写好了,代码比较多:

测试代码:Test.java
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);
}
}


Annotation 和相关代码:BeanDate.java, BeanDateType.java
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
}


核心代码:BeanBuilder.java
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));
}
}


处理日期 Annotation 的代码:
DateBeanBuilder.java
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);
}
migo2008 2009-08-22
  • 打赏
  • 举报
回复
综合楼上的几位:
1.重写toString()方法
2.如果楼主现在是重构代码的话,就用反射吧
wubin_2003 2009-08-22
  • 打赏
  • 举报
回复
重写toString()呗。。。。

public String toString(){
return " age="+age+" name="+name;

}
j1223jesus 2009-08-22
  • 打赏
  • 举报
回复
重写那个类的tostring()就行了吧,如果是自定义类的话。。。
Emerson_Li 2009-08-22
  • 打赏
  • 举报
回复
toString 方法不合楼主的意,因为你每个类如果都想实现这个功能就必须都实现toString方法。楼主估计是要一个一劳永逸的办法。就是写一次能适应全部。
楼主是想要一个方法,参数是这个要转化为字符串的对象,返回值是该对象的字符串序列对吗?
其实上面有人提到了,反射。
如果楼主不知道什么是反射,请问Google。
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧