您的位置:首页 > 编程语言 > Java开发

用Java反射API为POJO设值

2007-12-11 21:20 211 查看
在Java源文件被编译成.class文件时,会生成一个名为Class的class,俗称类对象,许多人感觉类对象很难, 其实不然,他就是一个名字为类的类,他可以得到他所代表的那个类的所有信息,包括方法,字段,构造器,父类,接口等等,下面是利用反射为POJO设值的一个小实例,以免自己忘记:


import java.lang.reflect.*;


import java.util.Random;


public class ReflectTest




...{




private static final Random rand = new Random();


public static String getStringGenerator()




...{




String[] ss =new String[]...{


new String("zhangsan"),


new String("lisi"),


new String("wangwu"),


new String("myblog"),


};


return ss[rand.nextInt(ss.length)];


}


public static void main(String[] args)




...{


Class<?> c;


try




...{


//得到Class对象


if(args.length==0)




...{


return;


}


c = Class.forName(args[0]);


Constructor[] cst = c.getConstructors();


Object[] oj = null;


Object o = null;


for(int i=0;i<cst.length;i++)




...{


Class[] cc = cst[i].getParameterTypes();


if(cc.length==1)




...{


String type = cc[0].getName();


if(type.equals("java.lang.String"))




...{




oj = new Object[]...{getStringGenerator()};


o = cst[i].newInstance(oj);


}


//System.out.println(type);




}


}








/**//*得到getter/setter方法*/


Method[] ms = c.getDeclaredMethods();


String name="";




for(int i=0;i<ms.length;i++)




...{


//得到方法的名字


name=ms[i].getName();


if(name.startsWith("set"))




...{




/**//* 按照POJO类里面的书写顺序,得到set方法的参数*/


Class[] cc = ms[i].getParameterTypes();


//如果cc.length==1,就说明每个set方法只有一个参数


if(cc.length==1)




...{


//得到参数的类型名字


String type=cc[0].getName();


//System.out.println(type);






/**//*下面可以得到属性的名字


try


{


String prop = Character.toLowerCase(name.charAt(3))+name.substring(4);


System.out.println(prop);


}


catch(Exception e)


{


e.printStackTrace();


}*/




if(type.equals("java.lang.String"))




...{




ms[i].invoke(o,new Object[]...{getStringGenerator()});


}




}


}


}


System.out.println(((Person)o).getName());




}


catch(IllegalArgumentException e)




...{


e.printStackTrace();


}


catch(Exception e)




...{


e.printStackTrace();


}


}


}

最后的invoke(Object o,Object[]..)是调用POJO的方法第一个参数表明你要调用哪个POJO类,第二个参数是传参数给你要调用的那个方法,不过只是把这些参数放在了一个Object数组里面,按顺序传递,

其中用于测试的Person类如下,很简单的一个JavaBean


class Person




...{


private int id;


private String name;




public Person()




...{




}




public Person(String name)




...{


this.name=name;


}




public void setId(int id)




...{


this.id=id;


}




public int getId()




...{


return id;


}




public void setName(String name)




...{


this.name=name;


}




public String getName()




...{


return name;


}


}

在取得构造器的时候,不会按你书写的顺序得到构造器,而是哪个构造器参数多就先取得哪个,依次下来,所以在取构造器用来得到实例的时候要注意构造器数组的下标,

更多帮助请查看官方中文帮助文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: