Javaのクラス情報をJTreeとJTableで表示する

結城浩

*

目次

はじめに

ClassViewは、 Javaのクラス情報をJTreeとJTableで表示する簡単なビューアです。 実際にツールとして使うというよりは、 java.swing.JTreeとjava.swing.JTableの小さなサンプルプログラムと考えてください。

コンパイル&実行は、

    javac ClassView.java
    java ClassView クラス名1 クラス名2 ...

のようにします(J2SE 1.4以降)。

例えば、

    java ClassView javax.swing.JFrame

とすると、javax.swing.JFrameが対象になります。

上半分のJTreeにはクラスの階層が表示されます。 マウスでクラス名を選択すると、下半分のJTableには、 クラス名、スーパークラス名、メソッドの一覧 が表示されます。 もっとたくさんの情報を表示してもよかったのですが、 とりあえず以上。

ソースコード

/* ClassView.java */
import java.lang.reflect.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class ClassView extends JFrame implements TreeSelectionListener {
    private static final String ROOT_OBJECT = "java.lang.Object";
    private final HashMap _nameToNode = new HashMap();
    private final TreeNode _root = createNode(ROOT_OBJECT);
    private final JTree _tree = new JTree(new DefaultTreeModel(_root));
    private final JTable _table = new JTable();
    private final JScrollPane _treePane = new JScrollPane(_tree);
    private final JScrollPane _tablePane = new JScrollPane(_table);
    public ClassView() {
        super("ClassView");
        _nameToNode.put(ROOT_OBJECT, _root);
        _treePane.setMinimumSize(new Dimension(640, 240));
        JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        pane.setTopComponent(_treePane);
        pane.setBottomComponent(_tablePane);
        pane.setPreferredSize(new Dimension(640, 480));
        getContentPane().add(pane, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        _tree.addTreeSelectionListener(this);
        pack();
        show();
    }
    public void add(String classname) {
        try {
            add(Class.forName(classname));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public void valueChanged(TreeSelectionEvent e) {
        Object[] path  = e.getPath().getPath();
        if (path != null && path.length > 0) {
            String className = path[path.length - 1].toString();
            showClassProperty(className);
        }
    }
    public void add(Class cls) {
        Vector v = new Vector();
        while (cls != null) {
            v.insertElementAt(cls.getName(), 0);
            cls = cls.getSuperclass();
        }
        for (int i = 0; i < v.size() - 1; i++) {
            String parentName = (String)v.get(i);
            String childName = (String)v.get(i + 1);
            DefaultMutableTreeNode parentNode = findNode(parentName);
            DefaultMutableTreeNode childNode = createNode(childName);
            parentNode.add(childNode);
        }
        repaint();
    }
    private DefaultMutableTreeNode findNode(String name) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)_nameToNode.get(name);
        return node;
    }
    private DefaultMutableTreeNode createNode(String name) {
        DefaultMutableTreeNode node = findNode(name);
        if (node == null) {
            node = new DefaultMutableTreeNode(name);
            _nameToNode.put(name, node);
        }
        return node;
    }
    private void showClassProperty(String className) {
        DefaultTableModel model = new DefaultTableModel();
        model.setColumnCount(2);
        _table.setModel(model);
        try {
            Class cls = Class.forName(className);
            Class supercls = cls.getSuperclass();
            Method[] methods = cls.getMethods();

            showProperty("name", className);
            if (supercls != null) {
                showProperty("super", supercls.getName());
            }
            for (int i = 0; i < methods.length; i++) {
                showProperty("method #" + (i + 1), methods[i].toString());
            }
        } catch (Exception e) {
        }
        _tablePane.repaint();
    }
    private void showProperty(String propName, String propValue) {
        DefaultTableModel model = (DefaultTableModel)_table.getModel();
        int row = model.getRowCount();
        model.setRowCount(row + 1);
        _table.setValueAt(propName, row, 0);
        _table.setValueAt(propValue, row, 1);
    }
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            System.out.println("Usage: java ClassView classname ...");
            System.out.println("Example: java ClassView javax.swing.JFrame");
        }
        ClassView view = new ClassView();
        for (int i = 0; i < args.length; i++) {
            view.add(args[i]);
        }
    }
}

実行した様子

*

更新履歴

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

豊かな人生のための四つの法則