java反射功能

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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的能力进行查询。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航