利用反射机制获得JavaBean的属性,然后生成一个XML文件.
  //XmlFrame.java package xmlgen.gui; 
 import java.awt.*; import javax.swing.*; 
public class XmlFrame extends JFrame{  public XmlFrame(){   this.setTitle("Xml Generator");      Toolkit kit=Toolkit.getDefaultToolkit();   Dimension d=kit.getScreenSize();   int width=d.width;   int height=d.height;      this.setLocation((width-800)/2,(height-600)/2);     this.setSize(800,600);   this.setContentPane(new XmlPanel());        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      this.show();   }  public static void main(String[] args){   new XmlFrame();  } }
  //XmlPanel.java 
package xmlgen.gui; 
 import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.swing.event.*; import java.util.*; import xmlgen.core.*; 
 public class XmlPanel extends JPanel{  private JPanel midPane,classPane,propertyPane,elementPane;  private JPanel xmlPane;  private JTextArea xmlContent;  private JTextField txtPackage,txtClass,txtRoot,txtElement,txtProperty;  private JLabel lblPackage,lblClass,lblRoot,lblElement;  private JButton btnClass,btnDelPro,btnAddElement,btnDelElement,btnGen;  private JList lstClass,lstXml;  private DefaultListModel lmClass,lmXml;   
 private void init(){   this.setLayout(new BorderLayout());              classPane=new JPanel();   classPane.setBorder(BorderFactory.createCompoundBorder(             BorderFactory.createTitledBorder("类全名"),              BorderFactory.createEmptyBorder(5,5,5,5)));         this.lblPackage=new JLabel("类包名:");         this.lblClass=new JLabel("类名:");         this.txtPackage=new JTextField(20);         this.txtClass=new JTextField(20);                 this.btnClass=new JButton("获得属性");         this.btnClass.setEnabled(false);         this.btnClass.addActionListener(new ActionListener(){          public void actionPerformed(ActionEvent e){           String fullName=txtPackage.getText().trim()+"."+txtClass.getText().trim();           Class c=null;           xmlContent.setText("");           lmClass.clear();           try{            c=Class.forName(fullName);           }                     catch(ClassNotFoundException ex){            xmlContent.setText("找不到指定的类,请确保环境变量设置正确");            return;           }           java.util.List list=Generator.getProperties(c);                      for(int i=0;i<list.size();i++)            lmClass.addElement(list.get(i));           if(lmClass.size()==0)            xmlContent.setText("找不到任何属性");          }          }         );                           this.txtClass.getDocument().addDocumentListener(          new AddTextListener(this.btnClass));                          classPane.add(this.lblPackage);         classPane.add(this.txtPackage);         classPane.add(this.lblClass);         classPane.add(this.txtClass);         classPane.add(this.btnClass);                      /*******************************************************************          */                      propertyPane=new JPanel(new BorderLayout());         propertyPane.setBorder(BorderFactory.createCompoundBorder(          BorderFactory.createTitledBorder("Bean 属性"),          BorderFactory.createEmptyBorder(5,5,5,5)));         this.lmClass =new DefaultListModel();         lmClass.addElement("这里是Bean的属性");         lmClass.addElement("点击上面的按钮可以生成");         lmClass.addElement("右边是XML中的属性");         lmClass.addElement("可以删除不必要的");         this.lstClass=new JList(this.lmClass);         this.lstClass.addListSelectionListener(new ListSelectionListener(){         public void valueChanged(ListSelectionEvent e) {           if (e.getValueIsAdjusting() == false) {                if (XmlPanel.this.lstClass.getSelectedIndex() == -1) {                //No selection, disable fire button.                   XmlPanel.this.btnDelPro.setEnabled(false); 
               } else {                 //Selection, enable the fire button.                   XmlPanel.this.btnDelPro.setEnabled(true);               }        }        }         }         );                JScrollPane sp1=new JScrollPane(this.lstClass);                                             this.btnDelPro=new JButton("删除属性");         this.btnDelPro.setEnabled(false);         this.btnDelPro.addActionListener(new DelPropertyListener());         JPanel p1=new JPanel();         p1.add(this.btnDelPro);                 propertyPane.add(sp1,BorderLayout.CENTER);         propertyPane.add(p1,BorderLayout.SOUTH);                  /***************************************************************          */         elementPane=new JPanel(new BorderLayout());         elementPane.setBorder(BorderFactory.createCompoundBorder(          BorderFactory.createTitledBorder("XML 元素属性"),          BorderFactory.createEmptyBorder(5,5,5,5)));                   this.lmXml=new DefaultListModel();                this.lstXml=new JList(this.lmXml);         this.lstXml.addListSelectionListener(new ListSelectionListener(){         public void valueChanged(ListSelectionEvent e) {           if (e.getValueIsAdjusting() == false) {                if (XmlPanel.this.lstXml.getSelectedIndex() == -1) {                //No selection, disable fire button.                   XmlPanel.this.btnDelElement.setEnabled(false); 
               } else {                 //Selection, enable the fire button.                   XmlPanel.this.btnDelElement.setEnabled(true);               }        }        }         }         );                  JScrollPane sp2=new JScrollPane(this.lstXml);         this.btnDelElement=new JButton("删除");         this.btnDelElement.setEnabled(false);         this.btnDelElement.addActionListener(new DelElementListener());                  this.txtProperty=new JTextField(15);         this.btnAddElement=new JButton("添加");         this.btnAddElement.setEnabled(false);         this.btnAddElement.addActionListener(new AddElement());                        this.txtProperty.getDocument().addDocumentListener(          new AddTextListener(this.btnAddElement));                            JPanel p2=new JPanel();         p2.add(this.btnDelElement);         p2.add(this.txtProperty);         p2.add(this.btnAddElement);                  elementPane.add(sp2,BorderLayout.CENTER);         elementPane.add(p2,BorderLayout.SOUTH);                            /***********************************************          */         xmlPane=new JPanel(new BorderLayout());         xmlPane.setBorder(BorderFactory.createCompoundBorder(          BorderFactory.createTitledBorder("生成的 XML"),          BorderFactory.createEmptyBorder(5,5,5,5)));          this.xmlContent=new JTextArea(10,60);         this.xmlContent.setEditable(false);                          this.lblRoot=new JLabel("根节点:");         this.lblElement=new JLabel("子节点名称:");         this.txtRoot=new JTextField("root",15);         this.txtElement=new JTextField("item",15);                  this.btnGen=new JButton("生成XML");         DocumentListener dl=new AddTextListener(this.btnGen);         this.txtRoot.getDocument().addDocumentListener(dl);         this.txtElement.getDocument().addDocumentListener(dl);                           this.btnGen.addActionListener(new ActionListener(){          public void actionPerformed(ActionEvent e){           String root=txtRoot.getText().trim();           String element=txtElement.getText().trim();           if(root.equals("")) root="root";           if(element.equals("")) element="item";           String[] rows=new String[lmClass.size()];           for(int i=0;i<lmClass.size();i++)            rows[i]=(String)lmClass.getElementAt(i);           String[] pros =new String[lmXml.size()];           for(int i=0;i<lmXml.size();i++)               pros[i]=(String)lmXml.getElementAt(i);           String s=Generator.generateXml(root,element,rows,pros);           xmlContent.setText(s);                      }         }         );                  JScrollPane sp3=new JScrollPane(this.xmlContent);         JPanel p3=new JPanel();         p3.add(this.lblRoot);         p3.add(this.txtRoot);         p3.add(this.lblElement);         p3.add(this.txtElement);         p3.add(this.btnGen);                                    xmlPane.add(sp3,BorderLayout.CENTER);         xmlPane.add(p3,BorderLayout.SOUTH);                                                  midPane=new JPanel(new GridLayout(1,1));                  midPane.add(propertyPane);         midPane.add(elementPane);                  //this.makeSize();                  this.add(classPane,BorderLayout.NORTH);         this.add(midPane,BorderLayout.CENTER);         this.add(xmlPane,BorderLayout.SOUTH);         //this.add(new JLabel("Fuck"),BorderLayout.NORTH);           }  public XmlPanel(){   init();   }          class AddElement implements ActionListener{   public void actionPerformed(ActionEvent e){    String name =txtProperty.getText().trim(); 
            //User didn't type in a unique name...             if (name.equals("") || lmXml.contains(name)) {                 Toolkit.getDefaultToolkit().beep();                 txtProperty.requestFocusInWindow();                 txtProperty.selectAll();                 return;             } 
            int index = lstXml.getSelectedIndex(); //get selected index             if (index == -1) { //no selection, so insert at beginning                 index = 0;             } else {           //add after the selected item                 index++;             } 
            lmXml.insertElementAt(name.trim(), index);             //If we just wanted to add to the end, we'd do this:             //listModel.addElement(employeeName.getText()); 
            //Reset the text field.             txtProperty.requestFocusInWindow();             txtProperty.setText(""); 
            //Select the new item and make it visible.             lstXml.setSelectedIndex(index);             lstXml.ensureIndexIsVisible(index);   }  }     class AddTextListener implements DocumentListener {         private boolean alreadyEnabled = false;         private JButton button; 
        public AddTextListener(JButton button) {             this.button = button;         } 
        //Required by DocumentListener.         public void insertUpdate(DocumentEvent e) {             enableButton();         } 
        //Required by DocumentListener.         public void removeUpdate(DocumentEvent e) {             handleEmptyTextField(e);         } 
        //Required by DocumentListener.         public void changedUpdate(DocumentEvent e) {             if (!handleEmptyTextField(e)) {                 enableButton();             }         } 
        private void enableButton() {             if (!alreadyEnabled) {                 button.setEnabled(true);             }         } 
        private boolean handleEmptyTextField(DocumentEvent e) {             if (e.getDocument().getLength() <= 0) {                 button.setEnabled(false);                 alreadyEnabled = false;                 return true;             }             return false;         }     }          class DelPropertyListener implements ActionListener {                  public void actionPerformed(ActionEvent e) {             //This method can be called only if             //there's a valid selection             //so go ahead and remove whatever's selected.             int[] index = lstClass.getSelectedIndices();             if(index.length==0) return;             for(int i=index.length-1;i>=0;i--)              lmClass.remove(index[i]); 
            int size = lmClass.getSize(); 
            if (size == 0) { //Nobody's left, disable firing.                 btnDelPro.setEnabled(false); 
            } else { //Select an index.                 //removed item in last position                 int pos=index[0]-1;        if(pos<0) pos=0;                 lstClass.setSelectedIndex(pos);                 lstClass.ensureIndexIsVisible(pos);             }         }     }       class DelElementListener implements ActionListener {                  public void actionPerformed(ActionEvent e) {             //This method can be called only if             //there's a valid selection             //so go ahead and remove whatever's selected.             int[] index = lstXml.getSelectedIndices();             if(index.length==0) return;             for(int i=index.length-1;i>=0;i--)              lmXml.remove(index[i]); 
            int size = lmXml.getSize(); 
            if (size == 0) { //Nobody's left, disable firing.                 btnDelElement.setEnabled(false); 
            } else { //Select an index.                 //removed item in last position                 int pos=index[0]-1;                 if(pos<0) pos=0;                 lstXml.setSelectedIndex(pos);                 lstXml.ensureIndexIsVisible(pos);             }         }     } }
  //Generator.java 
package xmlgen.core; 
 import java.util.*; import java.lang.reflect.*; public class Generator{    public static List getProperties(Class c){      Method[] ms=c.getMethods();      List list=new ArrayList();      String mn="";      String pro="";       for(int i=0;i<ms.length;i++){       if(ms[i].getParameterTypes().length!=0) continue;       mn=ms[i].getName();       if(mn.equals("getClass")) continue;       if(mn.startsWith("get")&&mn.length()>3){        pro=mn.substring(3,4).toLowerCase();        if(mn.length()>4) pro+=mn.substring(4);        list.add(pro);       }      }      return list;  }  private static String crln="\r\n";  public static String generateXml(String root,String element,String[] rows,String[] properties){   //   String pro="";   for(int i=0;i<properties.length;i++){    pro+=" "+properties[i]+"=\"\"";   }   String header="<"+element+" name=\"";            StringBuffer sb=new StringBuffer(100);   sb.append('<');   sb.append(root);   sb.append(">");   sb.append(crln);         for(int i=0;i<rows.length;i++){    sb.append('\t');    sb.append(header);    sb.append(rows[i]);    sb.append('\"');    sb.append(pro);    sb.append(" />");    sb.append(crln);      }      sb.append("</");   sb.append(root);   sb.append(">");   return sb.toString();  } } 
   
 
  |