package com.e2u.gui; import java.awt.BorderLayout; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; public class Introspector { private static Set<Class> leafNodeClassSet = new HashSet<Class>(); static { leafNodeClassSet.add(getClass("java.lang.Void")); leafNodeClassSet.add(getClass("java.lang.Character")); leafNodeClassSet.add(getClass("java.lang.Short")); leafNodeClassSet.add(getClass("java.lang.Integer")); leafNodeClassSet.add(getClass("java.lang.Long")); leafNodeClassSet.add(getClass("java.lang.Float")); leafNodeClassSet.add(getClass("java.lang.Double")); leafNodeClassSet.add(getClass("java.lang.String")); leafNodeClassSet.add(getClass("java.lang.Object")); } private Class clazz = null; private JTree tree = null; private JPanel treePanel = null; private Set<Class> visitedSet = new HashSet<Class>(); public Introspector(String className) { clazz = getClass(className); visitedSet.clear(); DefaultMutableTreeNode root = introspect(clazz, "root"); visitedSet.clear(); tree = new JTree(root) { public Insets getInsets() { return new Insets(5, 5, 5, 5); } }; tree.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if(SwingUtilities.isRightMouseButton(e)) { TreePath tp = tree.getPathForLocation(e.getX(), e.getY()); if(tp != null) { tree.setSelectionPath(tp); DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp .getLastPathComponent(); JPopupMenu menu = new JPopupMenu(); menu.add(new JMenuItem(node.toString())); menu.show(e.getComponent(), e.getX(), e.getY()); } } } }); tree.setEditable(true); JScrollPane scrollPane = new JScrollPane(tree); treePanel = new JPanel(); treePanel.setLayout(new BorderLayout()); treePanel.add(scrollPane, BorderLayout.CENTER); } public JTree getTree() { return tree; } public JPanel getTreePanel() { return treePanel; } private DefaultMutableTreeNode introspect(Class cls, String name) { DefaultMutableTreeNode node = null; if(cls.isArray()) { node = new DefaultMutableTreeNode(name + " -- " + cls.getComponentType() + "[]"); return node; } node = new DefaultMutableTreeNode(name + " -- " + cls.getName()); if(leafNodeClassSet.contains(cls)) { return node; } if(cls.isPrimitive() || cls.isInterface() || cls.isAnnotation() || cls.isEnum()) { return node; } if(visitedSet.contains(cls)) { System.out.println(cls.getName() + " visited"); return null; } visitedSet.add(cls); Field[] fields = null; // Super class is complex type if (cls.getSuperclass() != null && cls.getSuperclass() != Object.class) { fields = cls.getSuperclass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { addChild(node, introspect(fields[i].getType(), fields[i].getName())); } } fields = cls.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { addChild(node, introspect(fields[i].getType(), fields[i].getName())); } return node; } private static void addChild(DefaultMutableTreeNode parent, DefaultMutableTreeNode child) { if(child == null) { return; } parent.add(child); } private static Class getClass(String className) { Class cls = null; try { cls = Class.forName(className); } catch (ClassNotFoundException e) { cls = null; e.printStackTrace(); } return cls; } }