远方蔚蓝
一刹那情真,相逢不如不见

文章数量 126

访问次数 199827

运行天数 1437

最近活跃 2024-10-04 23:36:48

进入后台管理系统

一个简单的Xml与Object的互转的例子


1、用于ObjectBean的变量注解
@Retention(RUNTIME)
@Target(ElementType.FIELD)
public @interface BeanFormat {
	String name() default "field";
}
2、用于测试的ObjectBean,bean的变量使用前面定义的注解
public class TestBean {
	@BeanFormat(name="用户名*")
	private String name;
	@BeanFormat(name="性别*")
	private String gender = "";
	@BeanFormat(name="生日*")
	private String birth;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getBirth() {
		return birth;
	}
	public void setBirth(String birth) {
		this.birth = birth;
	}
	@Override
	public String toString() {
		return "TestBean{" +
				"name='" + name + '\'' +
				", gender=" + gender +
				", birth='" + birth + '\'' +
				'}';
	}
}
3、测试Xml转Object和Object转Xml
import com.goldpac.vtm.business.modules.api.annotations.BeanFormat;
import com.goldpac.vtm.business.modules.api.pojo.vo.TestBean;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BeanFormatUtil {
	/**
	 * 首字母大写
	 * @param a
	 * @return
	 */
	public static String firstWordUpperCase(String a){
		char[] chars = a.toCharArray();
		if (chars[0] >= 'a' && chars[0] <= 'z'){
			chars[0] = (char) (chars[0] -32);
		}
		return new String(chars);
	}
	/**
	 * 对象转xml
	 * @param obj
	 * @return
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
	public static String obj2Xml(Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
		Class<?> clazz = obj.getClass();
		Field[] declaredFields = clazz.getDeclaredFields();
		StringBuilder sb = new StringBuilder();
		for (Field declaredField : declaredFields) {
			if (declaredField.isAnnotationPresent(BeanFormat.class)){
				//获取注解名
				String name = declaredField.getAnnotation(BeanFormat.class).name();
				//获取字段名
				String fieldName = declaredField.getName();
				//获取字段类型
//				Type genericType = declaredField.getGenericType();
//				String typeName = genericType.getTypeName();
                           //获取get方法
				Method getMethod = null;
				try {
					getMethod = clazz.getMethod("get"+firstWordUpperCase(fieldName));
				} catch (NoSuchMethodException | SecurityException e) {
					e.printStackTrace();
					continue;
				}
				Object getResult = getMethod.invoke(obj);
				sb.append("<");
				sb.append(name);
				sb.append(">");
				sb.append(getResult == null ? "":getResult);
				sb.append("</");
				sb.append(name);
				sb.append(">");
			}
		}
		return sb.toString();
	}
	/**
	 * xml转对象
	 * @param xml
	 * @param obj
	 * @return
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
	public static Object xml2Obj(String xml, Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
		Class<?> clazz = obj.getClass();
		Field[] declaredFields = clazz.getDeclaredFields();
		int i , j , n;
		String re;
		for (Field declaredField : declaredFields) {
			if (declaredField.isAnnotationPresent(BeanFormat.class)){
				//获取注解名
				String name = declaredField.getAnnotation(BeanFormat.class).name();
				//获取字段名
				String fieldName = declaredField.getName();
				//获取字段类型
				Class<?> type = declaredField.getType();
				i = xml.indexOf("<" + name + ">");
				j = xml.indexOf("</" + name + ">");
				n = name.length();
				if (i >= 0 && j > i) {
					re = xml.substring(i + n + 2, j);
				}else {
					continue;
				}
				//获取get方法
				Method setMethod;
				try {
					setMethod = clazz.getMethod("set"+firstWordUpperCase(fieldName),type);
				} catch (NoSuchMethodException | SecurityException e) {
					e.printStackTrace();
					continue;
				}
				setMethod.invoke(obj,re);
			}
		}
		return obj;
	}
	public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
//		TestBean testBean = new TestBean();
//		testBean.setGender("女");
//		testBean.setName("张女士");
////		testBean.setBirth(DateUtil.nowTimestamp());
//		String s = obj2Xml(testBean);
//		System.out.println(s);
		String xml = "<用户名*>张女士</用户名*><生日*></生日*>";
		TestBean testBean = new TestBean();
		TestBean o = (TestBean)xml2Obj(xml, testBean);
		System.out.println(o.toString());
	}
}
4、Xml取值
    // 取XML域的值
    public static String getxml(String xml, String fd) {
        int i = xml.indexOf("<" + fd + ">"), j = xml.indexOf("</" + fd + ">"), n = fd.length();
        String re = "";
        if (i >= 0 && j > i)
            re = xml.substring(i + n + 2, j);
        return re.trim();
    }