反射使您的程序代码能够接入装载到 jvm 中的类的内部信息,允许你编写与执行时,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。 首先观察下面的 xml 文件:
<?xml version = 1.0 encoding = gb2312?><root> <arsubitem num="1"> <c_itemno>300200500009</c_itemno> <c_itemname>20050112测试</c_itemname> <c_subitemno>200543030000010</c_subitemno> <c_subitemname>20010112标段2</c_subitemname> <c_funcname>监督备案</c_funcname> </arsubitem></root>
该 xml 文件描述了一个标段当前流程信息,接下来把它翻译成 vo :
public class bidprocess implements serializable{
private string itemno; private string itemname; private string subitemno; private string subitemname; private string functionname;
/** * @return 返回 functionname。 */ public string getfunctionname() { return functionname; } /** * @param functionname 要设置的 functionname。 */ public void setfunctionname(string functionname) { this.functionname = functionname; } /** * @return 返回 itemname。 */ public string getitemname() { return itemname; } /** * @param itemname 要设置的 itemname。 */ public void setitemname(string itemname) { this.itemname = itemname; } /** * @return 返回 itemno。 */ public string getitemno() { return itemno; } /** * @param itemno 要设置的 itemno。 */ public void setitemno(string itemno) { this.itemno = itemno; } /** * @return 返回 subitemname。 */ public string getsubitemname() { return subitemname; } /** * @param subitemname 要设置的 subitemname。 */ public void setsubitemname(string subitemname) { this.subitemname = subitemname; } /** * @return 返回 subitemno。 */ public string getsubitemno() { return subitemno; } /** * @param subitemno 要设置的 subitemno。 */ public void setsubitemno(string subitemno) { this.subitemno = subitemno; }}
从 xml 构造 vo ,放入 list 中,代码如下:
public class vofactory {
// 构造出的对象集合 private arraylist list=new arraylist(); /** 利用反射获取结果集 */ public list parse(serializable source, string xml){ try{ //构造 xml 输入流 bytearrayinputstream ba=new bytearrayinputstream(xml.getbytes()); //dom4j 初始化 saxreader reader = new saxreader(); document document = reader.read(ba); element root = document.getrootelement(); //获得类对象 class c = source.getclass(); //获得构造函数 constructor[] cons=c.getdeclaredconstructors(); constructor con=cons[0]; //获得类中的字段 field[] fields = c.getdeclaredfields(); //设置访问private字段的权限 accessibleobject.setaccessible(fields,true); //以特定名称获得 xml 元素列表 list lis = root.elements("arsubitem"); //"arsubitem"元素下的子元素 for(int i=0;i<lis.size();i++){ element element=(element)lis.get(i); iterator iter=element.elementiterator(); //从构造函数实例化对象 serializable localobj=(serializable)con.newinstance(null); //按照字段个数循环 int j=0; while(iter.hasnext()){ element e=(element)iter.next(); fields[j].set(localobj,e.gettext()); j++; } list.add(localobj); } }catch(exception e){ e.printstacktrace(); } return list; }}
通过对以上代码原形进行修改,可实现分页、结果集嵌套等需求。在写作本文时,我偶然发现了 jakarta commons beanutils 也提供了类似的功能。那么本文就作为一个了解反射的范例罢了。
