在窗口中显示类信息

import java.lang.reflect.Field;
import javax.swing.JFrame;
import javax.swing.BorderFactory;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import java.awt.BorderLayout;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Container;
import java.awt.Color;
import javax.swing.text.JTextComponent;
import javax.swing.UIManager;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.lang.reflect.Modifier;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ViewClassInfoFrame extends JFrame implements ActionListener{
    //输入类名单行文本框
    private JTextField classNameField = new JTextField();
    //查看类信息按钮
    private JButton viewInfoButtom = new JButton();
    //提示输入类名的标签
    private JLabel hintLabel = new JLabel();
    //显示类信息的多行文本框
    private JTextArea InfoTextArea = new JTextArea();
    //滚动容器,不能独立存在
    private JScrollPane infoScrollPane = new JScrollPane();
    //一个标题边框,提示结果信息
    private TitledBorder titledBorder;

    //容器,可以盛放其他控件,不能单独存在
    private JPanel upPanel = new JPanel();
    private JPanel centerPanel = new JPanel();

    //容器的布局管理器,边界划分,分为东南西北中,默认为CENTER
    private BorderLayout mainFrameBorderLayout = new BorderLayout();
    private BorderLayout centerFrameBorderLayout = new BorderLayout();
    private BorderLayout upFrameBorderLayout = new BorderLayout();

    //通过构造函数创建对象实例时,初始化窗口和窗口中的组件
    public ViewClassInfoFrame(){
        //java.awt.Component,激活当前的窗口事件省略了this
//        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        init();                    //初始化窗口
        //java.awt.Container,当前窗口中GUI重新布局,生效
//        validate();
        }
    private void init(){
        //初始化文本输入框
        classNameField.setFont(new java.awt.Font("Dialog", 0, 15));
        classNameField.setSelectedTextColor(java.awt.Color.WHITE);
        classNameField.setText("");                //清空文本

        //初始化按钮和标签
        viewInfoButtom.setFont(new java.awt.Font("Dialog", 0, 13));
        viewInfoButtom.setText("查看类信息");
        //将按钮事件注册到监听队列
        viewInfoButtom.addActionListener(this);
        hintLabel.setFont(new java.awt.Font("Dialog", 0, 17));
        hintLabel.setText("请输入完整的类名:");

        //初始化文本域,不可编辑,初始为空
        InfoTextArea.setFont(new java.awt.Font("Dialog", 0, 13));
        InfoTextArea.setEditable(false);
        InfoTextArea.setText("");

        //初始化标题框,因为BorderFactory.createEtchedBorder()是静态方法,所以没有生成实例变量对象
        titledBorder = new TitledBorder(javax.swing.BorderFactory.createEtchedBorder(Color.white, new Color(134,134,134)), "结果信息");

        //初始化滚动容器--包含标题边框
        infoScrollPane.setBorder(titledBorder);
        //向滚动容器中的视口或悬窗(观看的窗口)添加多行文本框组件
        infoScrollPane.getViewport().add(InfoTextArea,null);

        //利用布局管理器将容器放入容器
        upPanel.setLayout(upFrameBorderLayout);
        upPanel.add(hintLabel, BorderLayout.NORTH);
        upPanel.add(classNameField, BorderLayout.CENTER);
        upPanel.add(viewInfoButtom, BorderLayout.SOUTH);

        //将滚动容器和内部的组件放到centerPanel面板
        centerPanel.setLayout(centerFrameBorderLayout);
        centerPanel.add(infoScrollPane, BorderLayout.CENTER);

        //获取当前窗口的内容容器,设置布局管理器
        this.getContentPane().setLayout(mainFrameBorderLayout);
        this.setSize(new Dimension(650, 560));
        this.setTitle("使用反射机制查看java的类信息");
        //向窗口内容容器中添加容器
        this.getContentPane().add(upPanel, BorderLayout.NORTH);
        this.getContentPane().add(centerPanel, BorderLayout.CENTER);

        //设置当前顶级容器操作的默认操作
        this.getRootPane().setDefaultButton(viewInfoButtom);
        //进程监听窗口的关闭事件
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }

    //实现ActionListener接口,处理鼠标事件,方法一定要是public
    public 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(getClassFields(c));
            buf.append("\n");
            buf.append(" /**构造函数**/\n");
            buf.append(getClassConstructors(c));
            buf.append("\n");
            buf.append(" /**方法**/\n");
            buf.append(getClassMethods(c));
            buf.append("\n");
        }catch(Exception 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 superClass = c.getSuperclass().getName();
            buf.append("public class ").append(c.getName());
            buf.append(" extends ").append(superClass).append(" {");
            }
        return buf.toString();
        }

    //获取Field信息
    private String getClassFields(Class c){
        StringBuffer buf = new StringBuffer();
        Field[] fields = c.getDeclaredFields();
        for(Field f:fields){
            //将Field的访问控制符转换为String类型
            String modifier = Modifier.toString(f.getModifiers());
            String type = f.getType().getName();
            buf.append(modifier).append(" ").append(type).append(" ").append(f.getName()).append(";\n");
            }
        return buf.toString();
        }    

    //获取构造函数信息
    private String getClassConstructors(Class c){
        Constructor[] constructors = c.getDeclaredConstructors();
        StringBuffer buf = new StringBuffer();
        for(Constructor con:constructors){
            //获取构造器的访问控制符
            String modifier = Modifier.toString(con.getModifiers());
            buf.append(modifier).append(" ").append(con.getName()).append(" (");
            //获取构造函数所有参数类型
            Class[] paremeters = con.getParameterTypes();
            for(int i=0;i<paremeters.length;i++){
                if(i==(paremeters.length-1)){
                    buf.append(paremeters[i].getName());
                    }
                else{
                    buf.append(paremeters[i].getName()).append(", ");
                    }
                }
            buf.append(")");
            Class[] excepTypes = con.getExceptionTypes();
            for(int i=0;i<excepTypes.length;i++){
                if(i==0){
                    buf.append("throws ");
                }
                if(i==(excepTypes.length-1)){
                    buf.append(excepTypes[i].getName());
                }else{buf.append(excepTypes[i].getName()).append(", ");}
                }
                buf.append("\n");
            }
            return buf.toString();
        }

    //获取所有方法信息
    private String getClassMethods(Class c){
        Method[] methods = c.getDeclaredMethods();
        StringBuffer buf = new StringBuffer();
        for(Method method:methods){
            String modifier = Modifier.toString(method.getModifiers());
            String type = method.getReturnType().getName();
            String name  = method.getName();
            buf.append(modifier).append(" ").append(type).append(" ").append(name).append("(");
            Class[] parameters = method.getParameterTypes();
            for(int i=0;i<parameters.length;i++){
                if(i==0){
                    buf.append(parameters[i].getName()).append(", ");
                    }
                if(i==(parameters.length-1)){
                    buf.append(parameters[i].getName());
                    }else{buf.append(parameters[i].getName()).append(", ");}
                }
            buf.append(") ");
            Class[] excepTypes = method.getExceptionTypes();
            for(int i=0;i<excepTypes.length;i++){
                if(i==0){
                    buf.append("throws ").append(excepTypes[i].getName());
                    }
                if(i==(excepTypes.length-1)){
                    buf.append(excepTypes[i].getName());
                    }else{buf.append(excepTypes[i].getName()).append(", ");}
                }
            buf.append("\n");
            }
        return buf.toString();
        }
    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);
        }
    } 

执行结果:

原文地址:https://www.cnblogs.com/celine/p/9426833.html

时间: 2024-10-13 07:22:58

在窗口中显示类信息的相关文章

jsp下拉框中显示数据库信息&&jsp 下拉框从数据库中如何取值?

jsp下拉框中显示数据库信息 <select> <option value=0>-- 请选择 --</option> <% dao d=new dao();// 这是那个数据库访问的类. List list=d.getData(); for(int i=0;i<list.size();i++) { %> <option value=<%=i+1%>><%=list.get(i)%></option> &l

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

IDA 在string窗口中显示中文字符串

打开ida61\cfg中的ida.cfg文件找到 // (cp866 version)AsciiStringChars = "\r\n\a\v\b\t\x1B" " !\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "`abcdefghijklmnopqrstuvwxyz{|}~" "€?‚ƒ„…†

如何在DOS窗口中显示UTF-8字符

在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集. 如果想正确显示UTF-8字符,可以按照以下步骤操作: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码页为65001 chcp 65001 执行该操作后,代码页就被变成UTF-8了.但是,在窗口中仍旧不能正确显示UTF-8字符.

windows dos命令下DOS窗口中显示UTF-8字符

在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集. 如果想正确显示UTF-8字符,可以按照以下步骤操作: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码页为65001 chcp 65001 执行该操作后,代码页就被变成UTF-8了.但是,在窗口中仍旧不能正确显示UTF-8字符.

在ASP.NET 5中显示错误信息

在 ASP.NET 5 中如果不进行显示错误信息的相关配置,在发生错误时,在浏览器中只能看到空白页面. 显示错误信息的配置方法如下: 1)在 project.json 中添加对 Microsoft.AspNet.Diagnostics 的引用 { "dependencies":{ "Microsoft.AspNet.Diagnostics": "1.0.0-*" } } 2)在 Startup.cs 中添加 app.UseErrorPage()

统计图钻取的明细报表在非模态窗口中显示

润乾报表的统计图可以在图例 / 图形上设置超链接,从而实现钻取到明细报表的操作,钻取得到的报表可以在新窗口或者当前窗口中打开.关于如何在统计图的图形 / 图例上设置超链接,在用户手册中有常用示例的介绍.今天小编要给大家介绍的是如何在非模态窗口中打开图形超链接钻取得到的报表.首先创建一张带有统计图的报表,报表文件名为 planWorkView2.rpx.增加数据集 ds1, 下面是 ds1 的数据: 在 A2 单元格中增加一个柱形图,统计图的分类和系列值数据分别来源于数据集 ds1 的 ORG_N

Office 2010 中打开多个Excel文件只能在同一窗口中显示的问题

安装Microsoft Office 2010 的朋友们可能会发现,当你打开多个Excel文件时,想要将几个文件对比参考时,发现无法将几个窗口并排放置,几个Excel文件是共享一个窗口的. 通过上网寻求帮助,找到了一种方法,可以使多个Excel文件在多个独立的窗口中打开. 注: 此方法在Windows 7及Windows XP下均测试有效. Start: 打开"运行"窗口(快捷键:Win + R),输入regedit编辑注册表. 定位到[HKEY_CLASSES_ROOT\Excel.

猎豹MFC--在窗口中显示按钮

现在框架窗口上定义私有的数据成员: 然后跳转到cpp文件: 上面是把按钮放在了框架窗口内而坐标 工具栏是在框架窗口的哦内部客户区中. 该按钮时放在了外面的框架窗口中.由以下可知: 现在重新做一个放在视图中: 增加私有变量: .给视图类增加OnCreate消息: 以上其实是由两个窗口构成外面的是框架窗口,里面的是视图窗口.两个按钮分别在不同的窗口. 来自为知笔记(Wiz)