| |
java反射包(java.lang.reflect)为我们提供一个强大的功能,利用它可以查出一个未知类所有的:数据字段,方法,构造器。下面这个程序就是一个利用reflect包写的一个简单的gui程序,在文本域里输入java标准类名(如:javax.swing.jbutton),按执行按钮,即可查出这个类所有的信息。
package reflectframe;
import javax.swing.uimanager; import java.awt.*;
public class reflect { /*main()类 boolean packframe = false;
//construct the application public reflect() { frame1 frame = new frame1(); //validate frames that have preset sizes /*pack frames that have useful preferred size info, e.g. from their layout*/ if (packframe) { frame.pack(); } else { frame.validate(); } //center the window dimension screensize = toolkit.getdefaulttoolkit().getscreensize(); dimension framesize = frame.getsize(); if (framesize.height > screensize.height) { framesize.height = screensize.height; } if (framesize.width > screensize.width) { framesize.width = screensize.width; } frame.setlocation((screensize.width - framesize.width) / 2, (screensize.height - framesize.height) / 2); frame.setvisible(true); } //main method public static void main(string[] args) { try { uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname()); } catch(exception e) { e.printstacktrace(); } new reflect(); } } /*主界面类*/ package reflectframe;
import java.awt.*; import java.awt.event.*; import javax.swing.*; import com.borland.jbcl.layout.*; import javax.swing.border.*; import java.lang.reflect.*;
public class frame1 extends jframe { jpanel contentpane; jtextfield jtextfield1 = new jtextfield(); jbutton jbutton1 = new jbutton(); jlabel jlabel1 = new jlabel(); jscrollpane jscrollpane1 = new jscrollpane(); jtextarea jtextarea1 = new jtextarea(); titledborder titledborder1; jlabel jlabel2 = new jlabel(); jpanel jpanel1 = new jpanel(); jpanel jpanel2 = new jpanel(); borderlayout borderlayout2 = new borderlayout(); borderlayout borderlayout1 = new borderlayout(); xylayout xylayout1 = new xylayout();
//construct the frame public frame1() { enableevents(awtevent.window_event_mask); try { jbinit(); } catch(exception e) { e.printstacktrace(); } toolkit tk=toolkit.getdefaulttoolkit(); image img=tk.getimage("status.gif"); cursor cu=tk.createcustomcursor(img,new point(10,10),"stick"); this.setcursor(cu); } //component initialization private void jbinit() throws exception { contentpane = (jpanel) this.getcontentpane(); titledborder1 = new titledborder(borderfactory.createetchedborder(color.white,new color(134, 134, 134)),"结果"); jtextfield1.setfont(new java.awt.font("dialog", 0, 15)); jtextfield1.setselectedtextcolor(color.white); jtextfield1.settext(""); contentpane.setlayout(borderlayout1); this.setsize(new dimension(450, 361)); this.settitle("reflect"); this.addwindowlistener(new frame1_this_windowadapter(this)); jbutton1.settext("执行"); jbutton1.addactionlistener(new frame1_jbutton1_actionadapter(this)); jlabel1.setfont(new java.awt.font("dialog", 0, 12)); jlabel1.settext("类名:"); jtextarea1.setfont(new java.awt.font("dialog", 0, 15)); jtextarea1.seteditable(false); jtextarea1.settext(""); jscrollpane1.setborder(titledborder1); jlabel2.settext(" "); jpanel1.setlayout(xylayout1); jpanel2.setlayout(borderlayout2); jpanel1.add(jtextfield1, new xyconstraints(55, 5, 304, -1)); jpanel1.add(jlabel1, new xyconstraints(16, 8, -1, -1)); jpanel1.add(jbutton1, new xyconstraints(374, 6, -1, -1)); jpanel2.add(jscrollpane1); contentpane.add(jpanel1, borderlayout.north); contentpane.add(jpanel2, borderlayout.center); jscrollpane1.getviewport().add(jtextarea1, null); this.getrootpane().setdefaultbutton(jbutton1); } //overridden so we can exit when window is closed protected void processwindowevent(windowevent e) { super.processwindowevent(e); if (e.getid() == windowevent.window_closing) { system.exit(0); } }
void jbutton1_actionperformed(actionevent e) { string classname=jtextfield1.gettext(); stringbuffer buf=new stringbuffer(); try{ class c = class.forname(classname); string supername=c.getsuperclass().getname(); /*得到该类的超类*/ buf.append(classname+" extends "+supername+"{"); buf.append(" /* 字段 */"); buf.append(getfields(c)); buf.append(" /* 构造器 */"); buf.append(getconstructors(c)); buf.append(" /* 方法 */"); buf.append(getmethods(c)); buf.append("}"); }catch(exception et){ joptionpane.showmessagedialog(this,"没找到该类:"+et.getmessage());} jtextarea1.settext(buf.tostring()); } public string getfields(class c){ /*得到该类的所有数据字段*/ string str=""; field[] fields=c.getdeclaredfields(); for(int i=0;i<fields.length;i++){ field f=fields[i]; str+=modifier.tostring(f.getmodifiers())+" "; /*数据字段修饰符*/ class type=f.gettype(); str+=type.getname()+" "; /*数据字段名*/ str+=f.getname()+";"; } return str; } public string getconstructors(class c){ /*得到构造器*/ string str=""; constructor[] cons=c.getdeclaredconstructors(); for(int i=0;i<cons.length;i++){ constructor c1=cons[i]; str+=modifier.tostring(c1.getmodifiers())+" "; /*得到修饰符*/ str+=c1.getname()+"("; /*c1.getname()构造器名*/ class[] cla=c1.getparametertypes(); for(int j=0;j<cla.length;j++){ /*得到构造器参数*/ if(j>0){ if(j==cla.length-1)str += cla[j].getname(); else str += cla[j].getname() + ", "; } } str+=");"; } return str; } public string getmethods(class c){ /*得到类里所有方法*/ string str=""; method[] m=c.getmethods(); for(int i=0;i<m.length;i++){ str+=modifier.tostring(m[i].getmodifiers())+" "; /*方法修饰符*/ class cla=m[i].getreturntype(); str+=cla.getname()+" "; /*cla.getname()是方法名*/ str+=m[i].getname()+"("; class[] clb=m[i].getparametertypes(); for(int j=0;j<clb.length;j++){ /*方法所有参数 if(j>0){ if (j == clb.length - 1)str += clb[j].getname(); else str += clb[j].getname() + ", "; } } str+=");"; } return str; } }
class frame1_jbutton1_actionadapter implements java.awt.event.actionlistener { frame1 adaptee;
frame1_jbutton1_actionadapter(frame1 adaptee) { this.adaptee = adaptee; } public void actionperformed(actionevent e) { adaptee.jbutton1_actionperformed(e); } }
class frame1_this_windowadapter extends java.awt.event.windowadapter { frame1 adaptee;
frame1_this_windowadapter(frame1 adaptee) { this.adaptee = adaptee; } } 反射功能在javabeans中得到最为充分的利用,对beans的能力进行查询。
|
|