网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java反射功能     
  文章作者:未知  文章来源:水木森林  
  查看:111次  录入:管理员--2007-11-17  
 
  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的能力进行查询。
 
 
上一篇: java繁体中文处理完全攻略    下一篇: java概述
  相关文档
用户登录的验证完整程序 11-17
java文萃:浅谈java技术中的数据库应用 11-16
nokia suite 3.0 for j2me功能介绍 11-17
提高java技能的几种简单有效的方法 11-17
加密网页破解大法 11-17
nokia开发者平台series60介绍 11-17
linux + java = lava(岩浆)? 11-17
aop在大规模软件开发项目中应用的尝试与思考 11-16
java认证考试的前期准备 11-17
读取数码照片中的exif信息 11-17
java入门:java语言中的一些常用的词汇 01-03
javac/smode--client 11-17
copyfolder 方法 11-16
jndi查找示例 11-17
j2ee应用部署(一):基础篇 11-17
使用java编写palm os程序的解决方案 11-17
java学习:彻底明白java的io系统 11-16
struts框架之构建controller组件 11-16
java web server2.0 11-17
java设计模式之修饰模式篇 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息