基于java反射知识的类查看器

来源:互联网 发布:mac user文件夹在哪 编辑:程序博客网 时间:2024/05/29 08:00
/** *  */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.Method;import java.lang.reflect.Modifier;import java.text.Format.Field;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.UnsupportedLookAndFeelException;import javax.swing.border.TitledBorder;/** * @author leorain * */public class ViewClassInfoFrame extends JFrame implements ActionListener{/** *  */private static final long serialVersionUID = -2998951761675541602L;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();}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);}/** * @param args */public static void main(String[] args) {try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedLookAndFeelException e) {// TODO Auto-generated catch blocke.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);}@Overridepublic void actionPerformed(ActionEvent e) {String className = classNameField.getText();StringBuffer buf = new StringBuffer();try {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 (ClassNotFoundException e1) {JOptionPane.showMessageDialog(this, "没找到该类:"+e1.getMessage());}infoTextArea.setText(buf.toString());}private String getClassStatement(Class c){StringBuffer buf = new StringBuffer();if(c.getName().equals("java.lang.Object")){buf.append("public class Object {");}else{String superName = c.getSuperclass().getName();buf.append("public class ").append(c.getName());buf.append(" extends ").append(superName).append(" {");}return buf.toString();}private String getFields(Class c){StringBuffer buf = new StringBuffer();java.lang.reflect.Field[] fields = c.getDeclaredFields();java.lang.reflect.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();}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();}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();}}

0 0