⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viewclassinfoframe.java

📁 本代码以J2SE 5.0为开发环境
💻 JAVA
字号:
package book.reflect;

import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;

/**
 * 查看类的信息,在文本框中输入类名,下面的文本域中将显示类的信息,
 * 信息包括类的声明、类的属性、类的构造方法、类的方法。
 */
public class ViewClassInfoFrame extends JFrame implements ActionListener {

	// 输入类名的文本矿
	JTextField classNameField = new JTextField();
	// 查看类信息的按钮
	JButton viewInfoButton = new JButton();
	// 提示输入类名的标签
	JLabel hintLabel = new JLabel();
	// 显示类信息的文本域和滚动面板
	JTextArea infoTextArea = new JTextArea();
	JScrollPane infoScrollPane = new JScrollPane();
	// 一个标题边框,提示结果信息
	TitledBorder titledBorder;

	// 上下两个面板,存放上面的各个组件
	JPanel upPanel = new JPanel();
	JPanel centerPanel = new JPanel();

	// 面板所使用的布局管理器
	BorderLayout mainFrameBorderLayout = new BorderLayout();
	BorderLayout centerPanelBorderLayout = new BorderLayout();
	BorderLayout upPanelBorderLayout = new BorderLayout();

	// 构造方法
	public ViewClassInfoFrame() {
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		init();
		validate();
	}

	/**
	 * 初始化窗口
	 * @throws Exception
	 */
	private void init() {
		//初始化输入文本框
		classNameField.setFont(new java.awt.Font("Dialog", 0, 15));
		classNameField.setSelectedTextColor(Color.white);
		classNameField.setText("");
		// 初始化按钮和标签
		viewInfoButton.setFont(new java.awt.Font("Dialog", 0, 13));
		viewInfoButton.setText("查看类信息");
		viewInfoButton.addActionListener(this);
		hintLabel.setFont(new java.awt.Font("Dialog", 0, 13));
		hintLabel.setText("请输入完整的类名:");
		// 初始化文本域
		infoTextArea.setFont(new java.awt.Font("Dialog", 0, 14));
		infoTextArea.setEditable(false);
		infoTextArea.setText("");
		// 初始化标题边框
		titledBorder = new TitledBorder(BorderFactory.createEtchedBorder(
				Color.white, new Color(134, 134, 134)), "结果信息");
		infoScrollPane.setBorder(titledBorder);
		infoScrollPane.getViewport().add(infoTextArea, null);
		// 将容器放入面板
		upPanel.setLayout(upPanelBorderLayout);
		centerPanel.setLayout(centerPanelBorderLayout);
		upPanel.add(hintLabel, BorderLayout.NORTH);
		upPanel.add(classNameField, BorderLayout.CENTER);
		upPanel.add(viewInfoButton, BorderLayout.SOUTH);
		centerPanel.add(infoScrollPane);
		
		// 将面板放入窗体
		this.getContentPane().setLayout(mainFrameBorderLayout);
		this.setSize(new Dimension(450, 360));
		this.setTitle("使用反射机制查看Java类的信息");
		
		this.getContentPane().add(upPanel, BorderLayout.NORTH);
		this.getContentPane().add(centerPanel, BorderLayout.CENTER);

		this.getRootPane().setDefaultButton(viewInfoButton);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	/**
	 * 实现ActionListener接口,处理鼠标事件
	 */
	public void actionPerformed(ActionEvent e) {
		// 从输入文本框中提取类名
		String className = classNameField.getText();
		StringBuffer buf = new StringBuffer();
		try {
			// 动态加载类,获得类的Class对象
			Class c = Class.forName(className);
			buf.append("   /** 类的声明 **/\n");
			buf.append(getClassStatement(c));
			buf.append("\n");
			
			buf.append("   /** 字段 **/\n");
			buf.append(getFields(c));
			
			buf.append("   /**  构造器 **/\n");
			buf.append(getConstructors(c));
			
			buf.append("   /**  方法 **/\n");
			buf.append(getMethods(c));
			buf.append("}\n");
		} catch (Exception et) {
			JOptionPane.showMessageDialog(this, "没找到该类:" + et.getMessage());
		}
		infoTextArea.setText(buf.toString());
	}
	
	/**
	 * 获取类的声明
	 * @param c
	 * @return
	 */
	private String getClassStatement(Class c){

		StringBuffer buf = new StringBuffer();
		
		if (c.getName().equals("java.lang.Object")){
			buf.append("public class Object {");
			return buf.toString();
		} else {
			// 得到该类的父类名
			String superName = c.getSuperclass().getName();
			// 
			buf.append("public class ").append(c.getName());
			buf.append(" extends ").append(superName).append(" {");
		}
		return buf.toString();
	}

	/**
	 * 获取类的属性
	 * @param c
	 * @return
	 */
	private String getFields(Class c) {
		StringBuffer buf = new StringBuffer();
		// 获得类声明的属性
		Field[] fields = c.getDeclaredFields();
		// 遍历属性,提取属性信息
		Field f = null;
		for (int i = 0; i < fields.length; i++) {
			f = fields[i];
			// 获取属性的访问修饰符
			buf.append(Modifier.toString(f.getModifiers())).append(" ");
			// 获取属性的类型
			Class type = f.getType();
			buf.append(type.getName()).append(" ");
			// 获取属性名
			buf.append(f.getName()).append(";\n");
		}
		return buf.toString();
	}

	/**
	 * 获取类的构造方法
	 * @param c
	 * @return
	 */
	private String getConstructors(Class c) {
		StringBuffer buf = new StringBuffer();
		// 获取类的否造方法
		Constructor[] cons = c.getDeclaredConstructors();
		Constructor con = null;
		// 遍历构造方法
		for (int i = 0; i < cons.length; i++) {
			con = cons[i];
			// 获取构造方法的访问修饰符
			buf.append(Modifier.toString(con.getModifiers())).append(" ");
			// 获取构造方法的名字
			buf.append(con.getName()).append("(");
			// 获取构造方法的参数类型
			Class[] paramTypes = con.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++) {
				if (j == (paramTypes.length - 1)){
					buf.append(paramTypes[j].getName());
				} else {
					buf.append(paramTypes[j].getName()).append(", ");
				}
			}
			buf.append(")");
			
			// 获取方法声明的异常
			Class[] excepTypes = con.getExceptionTypes();
			for (int j = 0; j < excepTypes.length; j++) {
				if (j == 0){
					buf.append(" throws ");
				}
				if (j == excepTypes.length - 1) {
					buf.append(excepTypes[j].getName());
				} else {
					buf.append(excepTypes[j].getName()).append(", ");
				}
			}
			buf.append("\n");
		}
		return buf.toString();
	}

	/**
	 * 获取类声明的方法
	 * @param c
	 * @return
	 */
	private String getMethods(Class c) {
		StringBuffer buf = new StringBuffer();
		// 获得类的所有方法, 注意,不能获得私有方法。
		Method[] methods = c.getMethods();
		// 遍历所有方法
		Method method = null;
		for (int i = 0; i < methods.length; i++) {
			method = methods[i];
			// 获取方法的访问修饰符
			buf.append(Modifier.toString(method.getModifiers())).append(" ");
			// 获取方法的返回类型
			Class returnType = method.getReturnType();
			buf.append(returnType.getName()).append(" ");
			// 获取方法名
			buf.append(method.getName()).append("(");
			
			// 获取方法的参数类型
			Class[] paramTypes = method.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++) {
				if (j == paramTypes.length - 1) {
					buf.append(paramTypes[j].getName());
				} else {
					buf.append(paramTypes[j].getName()).append(", ");
				}
			}
			buf.append(")");
			
			// 获取方法声明的异常
			Class[] excepTypes = method.getExceptionTypes();
			for (int j = 0; j < excepTypes.length; j++) {
				if (j == 0){
					buf.append(" throws ");
				}
				if (j == excepTypes.length - 1) {
					buf.append(excepTypes[j].getName());
				} else {
					buf.append(excepTypes[j].getName()).append(", ");
				}
			}
			buf.append("\n");
		}
		return buf.toString();
	}
	
	//Main method
	public static void main(String[] args) {
		try {
			//设置界面的外观,为系统外观
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		ViewClassInfoFrame frame = new ViewClassInfoFrame();

		//获取屏幕的分辨率,使窗体居中显示
		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);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -