其实就是出于“偷懒”,不想写那么多代码。
例如有个实体类people有下面的属性:
id int;
name String;
sex String;
age byte;
job String;然后有个ArrayList<Object> al=new ArrayList<Object>();
然后想用那个方法,自动把people里面的各个属性值,自动add入al里面?最好能有个通用的方法,因为我的项目里面,有很多不同的实体类。
例如有个实体类people有下面的属性:
id int;
name String;
sex String;
age byte;
job String;然后有个ArrayList<Object> al=new ArrayList<Object>();
然后想用那个方法,自动把people里面的各个属性值,自动add入al里面?最好能有个通用的方法,因为我的项目里面,有很多不同的实体类。
不过哥们,你这样做,真的不符合面向对象的思想。
private void setFieldV(Field f,Object v,ResultSet rs) throws SQLException, IllegalArgumentException, IllegalAccessException {
Class cls=f.getType();
// String clsname=f.getType().getName();
//System.out.println("fieldtype:"+clsname);
if (cls.equals(java.util.Date.class)) {
Date dd=rs.getTimestamp(f.getName());
f.set(v,dd);
} else if (cls.equals(java.lang.Long.class)) {
Long ll;
ll=new Long(rs.getLong(f.getName()));
f.set(v,ll);
//System.out.println("fieldtype========:"+clsname);
} else if (cls.equals(long.class)) {
long ll;
ll=rs.getLong(f.getName());
f.setLong(v,ll);
} else if (cls.equals(java.lang.Integer.class)) {
Integer ll;
ll=new Integer(rs.getInt(f.getName()));
f.set(v,ll);
//System.out.println("fieldtype========:"+clsname);
} else if (cls.equals(int.class)) {
int ll;
ll=rs.getInt(f.getName());
f.setInt(v,ll);
} else if (cls.equals(java.lang.Float.class)) {
Float ll;
ll=new Float(rs.getFloat(f.getName()));
f.set(v,ll);
//System.out.println("fieldtype========:"+clsname);
} else if (cls.equals(float.class)) {
float ll;
ll=rs.getFloat(f.getName());
//System.out.println("===="+ll);
f.setFloat(v,ll);
} else if (cls.equals(java.lang.Double.class)) {
Double ll;
ll=new Double(rs.getDouble(f.getName()));
f.set(v,ll);
//System.out.println("fieldtype========:"+clsname);
} else if (cls.equals(double.class)) {
double ll;
ll=rs.getDouble(f.getName());
f.setDouble(v,ll);
} else if (cls.equals(java.lang.StringBuffer.class)) {
StringBuffer ll=null;
Clob content=rs.getClob(f.getName());
if (content!=null) {
String buf= content.getSubString(1,(int)content.length());
ll = new StringBuffer(buf); }
f.set(v,ll) ;
} else {
f.set(v,rs.getString(f.getName()));
}
答3楼:用属性名字做key放到Map里面的话,也是不能用循环啊,而且不同的类,还要写不同的代码哩。当然,如果可以用循环的方式把属性名字取出来的话,就已经差不多和我的需求一致了。确实,用循环的话是破坏了面向对象的思想,但我觉得,用SSH等等不同的框架,包括最简单的MVC结构,都是和面向对象的思想在某种程度上是相违背的。其他几位网友说的反射,我的水平较低,还没有接触过,请问5楼的网友,你的代码算不算是用了“反射”呢?有没有反射的一些代码呢?昨晚我想到一个类:Enum枚举类,我看了一下,也在电脑上试了一下,不得要领,不知道怎么用这个类,请问是否可以把一个放到里面,然后在枚举出来放到ArrayList或者Map里面呢?
People p = new People();
...........
Field[] fields = p.getClass().getDeclaredFields();
for(Field f : fields) {
System.out.println(f.get(o));
}
for(Method m : methods) {
if(m.getName().startsWith("get"))
System.out.println(m.invoke(p));
}
Method[] methods = p.getClass().getDeclaredMethods();
for(Method m : methods) {
if(m.getName().startsWith("get")) {
map.put(m.getName().toLowerCase().replaceAll("get", ""), m.invoke(p));
}
}
for(Object key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
[code=Java]package wwww;
//我以为你用HashSet保存一个对象比较好,以为HashSet不可以保存相同的对象。
//如果你要ArrayList保存的话,对象就不用implements Serializable了,
// 建议你用HashSet比较好,当然看看你的实际情况了。
//
import java.io.Serializable;
public class People implements Serializable{
/**
* implements Serializable
* 《必须》就要覆盖equals(Object obj)和hashCode()方法。这里我只根据id判断而已。
*/
private static final long serialVersionUID = 997106258691414833L;
private int id;
private String name;
private String sex;
private byte age;
private String job;
public People( int id, String job, String name, byte age,String sex)
{
super();
this.age = age;
this.id = id;
this.job = job;
this.name = name;
this.sex = sex;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
public byte getAge()
{
return age;
}
public void setAge(byte age)
{
this.age = age;
}
public String getJob()
{
return job;
}
public void setJob(String job)
{
this.job = job;
}
public int hashCode() {
return id;
}
public boolean equals(Object obj) {
if(obj instanceof People){
People agent = (People)obj;
if(agent.id==id){
return true;
}
}
return false;
}
public String toString()
{
return name+" "+id+" "+sex+" "+job+" "+age;
}
}package wwww;import java.util.HashSet;
import java.util.Set;public class Test
{
public static void main(String[] args)
{
Set<People> set = new HashSet<People>();
byte b=1;
People p1 = new People(911,"yang","男",b,"java");
People p2 = new People(912,"zhu","女",b,"c++");
People p3 = new People(912,"zhang","女",b,"c");
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set.size()+"个people");
System.out.println(set);
}
}
[/code]
就是反射,很简单的,你用一下就清楚了:Field[] fields = obj.getClass().getDeclaredFields();fields 就是你所要的,如果只想取public 的field,则 obj.getClass().getFields();
如果还有其它需要可以参考
obj.getClass().getxxx 函数,看名字就就大概知道有什么东西.
个人愚见,所谓反射是指在运行期(而不是在编译期)动态加载一个类文件转化为对象(Class)到内存中,并由java.lang.reflect包中提供的一些类进行操作(有构造方法、方法、等等),通过遍历可以获取所有的方法签名及参数列表等内容,并根据此判断建立所需的方法对象,并调用之。
代码其实不难,但想写好却不容易,通常类似的逻辑都挺复杂,多思考一下hibernate是如何根据配置文件将对应的值赋给pojo的,这个算是很典型的例子