发新话题
移动帖子 加入精华 加入置顶 加入收藏 关注此帖

反射`希望能够提高效率`那位高人帮帮`



反射`希望能够提高效率`那位高人帮帮`

String str ="name=xiaomaha,password=123456,date=2007-05-20"
格式(=号前面的字符串必须和下面代码的属性对应)

private Integer id;

	private String name;

	private String password;

	private Date date;


POJO
package com.xiaomaha.po;

import java.util.Date;

/**
 * User generated by MyEclipse Persistence Tools
 */

public class User implements java.io.Serializable {

	// Fields

	private Integer id;

	private String name;

	private String password;

	private Date date;

	// Constructors

	/** default constructor */
	public User() {
	}

	/** minimal constructor */
	public User(String name) {
		this.name = name;
	}

	/** full constructor */
	public User(String name, String password, Date date) {
		this.name = name;
		this.password = password;
		this.date = date;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Date getDate() {
		return this.date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

}



我写了个这个工具类来实现动态产生对象并且赋值``但我测试过10000次大概需要1秒``希望高手能帮我优化下``我感觉自己写的很烂!
工作中需要用的!
/**
	 * 
	 * @param bean JavaBean标准,类名
	 * @param str  以字符传形式传递,与bean属性相同`不区分大小写
	 * @return     返回bean实例,需要强转
	 */
	public static Object createObject(Class bean, String str) throws Exception,
			Exception {
		Method[] m = bean.getMethods();
		Object obj = bean.newInstance();
		String[] ss = str.split(",");
		for (int j = 0; j < ss.length; j++) {
			String[] sts = ss[j].split("=");
			for (int i = 0; i < m.length; i++) {
				if (m[i].getName().startsWith("set")) {
					if(m[i].getName().substring(3, m[i].getName().length()).equalsIgnoreCase(sts[0])){
						Class[] cl = m[i].getParameterTypes();
						for (int k = 0; k < cl.length; k++) {
							if (cl[k].getName().equals("int")
									|| cl[k].getName().equals(
											"java.lang.Integer")){
								m[i].invoke(obj, new Integer(sts[1]));
							}
							if (cl[k].getName().equals("java.lang.String")){
								m[i].invoke(obj, sts[1]);
							}
							if (cl[k].getName().equals("java.util.Date")){
								m[i].invoke(obj, getTheTime(sts[1]));
							}
							if (cl[k].getName().equals("java.sql.Date")){
								m[i].invoke(obj, getTheTime(sts[1]));
							}
						}
					}
				}
			}
		}

		return obj;
	}
	/**
	 * 
	 * @param date  字符类型转日期类型
	 * @return  返回yyyy-MM-dd  格式日期类型 
	 */
	public static Date getTheTime(String date) {

		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Date cDate = null;
		Date dd = null;
		try {
			cDate = df.parse(date);
			dd = new java.sql.Date(cDate.getTime());

		} catch (ParseException e) {
			
			e.printStackTrace();
		}

		return dd;
	}
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

去看apache的BeanUtil的开发包吧。 你的效率应该不算差了。呵呵。
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

完全没用优雅性而言纯粹为了测试而写,还有很多地方有待加工, 我机器上测试 400-550毫秒
public class TestMain {
 public static Map methodMap = new HashMap();
 static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 /**
  *
  * @param bean
  *            JavaBean标准,类名
  * @param str
  *            以字符传形式传递,与bean属性相同`不区分大小写
  * @return 返回bean实例,需要强转
  */
 public static Object createObject(Object obj, String str) throws Exception,
   Exception {
  String[] ss = str.split(",");
  for (int j = 0; j < ss.length; j++) {
   String[] sts = ss[j].split("=");
   Method method = (Method) methodMap
     .get("SET" + sts[0].toUpperCase());
   if (method == null)
    continue;
   Class[] cl = method.getParameterTypes();
   for (int k = 0, length = cl.length; k < length; k++) {
    Class clazz = cl[k];
    if (clazz.equals(java.lang.Integer.class)
      || clazz.getName().equals("int")) {
     method.invoke(obj, new Integer(sts[1]));
    } else if (clazz.equals(java.lang.String.class)) {
     method.invoke(obj, sts[1]);
    } else if (clazz.equals(java.util.Date.class)) {
     method.invoke(obj, getTheTime(sts[1]));
    } else if (clazz.equals(java.sql.Date.class)) {
     method.invoke(obj, getTheTime(sts[1]));
    }
   }
  }
  return obj;
 }
 /**
  *
  * @param date
  *            字符类型转日期类型
  * @return 返回yyyy-MM-dd 格式日期类型
  */
 public static Date getTheTime(String date) {
  java.util.Date cDate = null;
  Date dd = null;
  try {
   cDate = df.parse(date);
   dd = new java.sql.Date(cDate.getTime());
  } catch (Exception e) {
   e.printStackTrace();
  }
  return dd;
 }
 /**
  * Description:
  *
  * @param args
  * @throws Exception
  * @mail sunyujia@yahoo.cn
  * @since:Aug 17, 2008 5:01:46 PM
  */
 public static void main(String[] args) throws Exception {
  Method[] m = User.class.getMethods();
  for (int i = 0; i < m.length; i++) {
   methodMap.put(m[i].getName().toUpperCase(), m[i]);
  }
  String s = "name=xiaomaha,password=123456,date=2007-05-20";
  Date sDate = new Date();
  User u = new User();
  for (int i = 0; i < 10000; i++) {
   createObject(new User(), s);
  }
  System.out.println(new Date().getTime() - sDate.getTime());
 }
}
class User implements java.io.Serializable {
 // Fields
 private Integer id;
 private String name;
 private String password;
 private Date date;
 // Constructors
 /** default constructor */
 public User() {
 }
 /** minimal constructor */
 public User(String name) {
  this.name = name;
 }
 /** full constructor */
 public User(String name, String password, Date date) {
  this.name = name;
  this.password = password;
  this.date = date;
 }
 // Property accessors
 public Integer getId() {
  return this.id;
 }
 public void setId(Integer id) {
  this.id = id;
 }
 public String getName() {
  return this.name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPassword() {
  return this.password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public Date getDate() {
  return this.date;
 }
 public void setDate(Date date) {
  this.date = date;
 }
}

编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

谢谢``我一定去看
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

sunyujia
感谢``我感觉你的程序有一点小小的问题`
但是我通过你的进行了修改`效率稍有提高`
/**
	 * 
	 * @param bean
	 *            JavaBean标准,类名
	 * @param str
	 *            以字符传形式传递,与bean属性相同`不区分大小写
	 * @return 返回bean实例,需要强转
	 */
	public static Object createObject(Class bean, String str) throws Exception {
		Method[] m = bean.getMethods();
		Map<String, Object> methodMap = new HashMap<String, Object>();
		for (int i = 0; i < m.length; i++) {
			methodMap.put(m[i].getName().toUpperCase(), m[i]);
		}
		Object obj = bean.newInstance();
		String[] ss = str.split(",");
		for (int j = 0; j < ss.length; j++) {
			String[] sts = ss[j].split("=");
			Method method = (Method) methodMap
					.get("SET" + sts[0].toUpperCase());
			if (method == null)
				continue;
			Class[] cl = method.getParameterTypes();
			for (int k = 0, length = cl.length; k < length; k++) {
				Class clazz = cl[k];
				if (clazz.equals(java.lang.Integer.class)
						|| clazz.getName().equals("int")) {
					method.invoke(obj, new Integer(sts[1]));
				} else if (clazz.equals(java.lang.String.class)) {
					method.invoke(obj, sts[1]);
				} else if (clazz.equals(java.util.Date.class)) {
					method.invoke(obj, getTheTime(sts[1]));
				} else if (clazz.equals(java.sql.Date.class)) {
					method.invoke(obj, getTheTime(sts[1]));
				}
			}
		}
		return obj;
	}
	/**
	 * 
	 * @param date
	 *            字符类型转日期类型
	 * @return 返回yyyy-MM-dd 格式日期类型
	 */
	private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
	public static Date getTheTime(String date) throws ParseException {
		java.util.Date cDate = null;
		cDate = df.parse(date);
		Date dd = new java.sql.Date(cDate.getTime());
		return dd;
	}
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

   public static Object createObject(Class bean, String str) throws Exception {
Map<String, Object> methodMap = new HashMap<String, Object>();
Object obj = bean.newInstance();
String[] ss = str.split(",");
for (int j = 0; j < ss.length; j++) {
String[] sts = ss[j].split("=");
PropertyDescriptor pd = new PropertyDescriptor(sts[0], bean);
Method method = pd.getWriteMethod();
if (method == null)
continue;
Class clazz = pd.getPropertyType();
if (clazz.equals(java.lang.Integer.class) || clazz.getName().equals("int")) {
method.invoke(obj, new Integer(sts[1]));
} else if (clazz.equals(java.lang.String.class)) {
method.invoke(obj, sts[1]);
} else if (clazz.equals(java.util.Date.class)) {
method.invoke(obj, getTheTime(sts[1]));
} else if (clazz.equals(java.sql.Date.class)) {
method.invoke(obj, getTheTime(sts[1]));
}
}
return obj;
}
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

	
public static Object createObject1(Class bean, String str) throws Exception { 
		Map<String, Object> methodMap = new HashMap<String, Object>(); 
		Object obj = bean.newInstance(); 
		String[] ss = str.split(","); 
		for (int j = 0; j < ss.length; j++) { 
		String[] sts = ss[j].split("="); 
		PropertyDescriptor pd = new PropertyDescriptor(sts[0], bean); 
		Method method = pd.getWriteMethod(); 
		if (method == null) 
		continue; 
		Class clazz = pd.getPropertyType(); 
		if (clazz.equals(java.lang.Integer.class) || clazz.getName().equals("int")) { 
		method.invoke(obj, new Integer(sts[1])); 
		} else if (clazz.equals(java.lang.String.class)) { 
		method.invoke(obj, sts[1]); 
		} else if (clazz.equals(java.util.Date.class)) { 
		method.invoke(obj, getTheTime(sts[1])); 
		} else if (clazz.equals(java.sql.Date.class)) { 
		method.invoke(obj, getTheTime(sts[1])); 
		} 
		} 
		return obj; 
		}

有问题的```````如果格式为 会出错的!
public static void main(String[] args) throws Exception{
		String str = "name=xiaomaha,password=123456,date=1984-05-20,id=999";
		User user = (User) Pack.createObject1(User.class, str);
		System.out.println(user.getName());
	}


错误信息!
Exception in thread "main" java.beans.IntrospectionException: Method not found: isId
at java.beans.PropertyDescriptor.<init>(Unknown Source)
at java.beans.PropertyDescriptor.<init>(Unknown Source)
at org.xiaomaha.tools.Pack.createObject1(Pack.java:154)
at org.xiaomaha.tools.Pack.main(Pack.java:175)


不过还是感谢你的回答``真诚的说声`谢谢
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

感觉这个是Java学习笔记中的一段代码
Everyone is No 1~``
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

这个我测试了 没问题
Exception in thread "main" java.beans.IntrospectionException: Method not found: isId

这个信息 应该是你的User类中没有 id属性和正确的setter,getter方法 检查下
编辑 回复 快速回复 TOP

Re:反射`希望能够提高效率`那位高人帮帮`

都有的!
编辑 回复 快速回复 TOP
发新话题