2013-03-02 88 views
-2

我想創建Java POJO類動態的java 1.6我想創建Java POJO類動態

以下是需求量的:

我有一個方法,該方法在參數的類名和地圖.The地圖鍵將是原始類型和映射值將是可變

create Class(String ClassName, HashMap map) 
{ 
} 

當調用該方法時,應該創建具有指定名稱一個.java文件,並與所傳遞的哈希映射創建POJO並將其存儲在一些位置。

你們能幫我解決這個問題嗎?

我希望我能清楚地提出我的問題。

謝謝。

回答

0
public class MapFirst 
{ 
    public static void createClass (
     String className, Map <Class<?>, String> fields) throws IOException 
    { 
     StringBuilder builder = new StringBuilder(); 

     String packageName; 
     int idx = className.lastIndexOf ('.'); 
     if (idx >= 0) 
     { 
      packageName = className.substring (0, idx); 
      className = className.substring (idx + 1); 
     } 
     else packageName = null; 

     if (packageName != null) 
      builder.append ("package ").append (packageName).append (";\n"); 

     builder.append ("\n"); 

     builder.append ("public class ").append (className).append ("\n"); 

     builder.append ("{\n"); 

     boolean flag = false; 
     for (Map.Entry <Class <?>, String> field: fields.entrySet()) 
     { 
      Class <?> type = field.getKey(); 
      String name = field.getValue(); 
      String nameCapitalized = Character.toUpperCase (name.charAt (0)) + name.substring (1); 

      if (flag) builder.append ("\n"); 
      flag = true; 
      builder.append (" private ").append (type).append (" ").append (name).append (";\n"); 
      builder.append ("\n"); 
      builder.append (" public ").append (type).append (" get").append (nameCapitalized).append ("()\n"); 
      builder.append (" {\n"); 
      builder.append ("  return ").append (name).append (";\n"); 
      builder.append (" }\n"); 
      builder.append ("\n"); 
      builder.append (" public void set").append (nameCapitalized).append (" (").append (type).append (" ").append (name).append (")\n"); 
      builder.append (" {\n"); 
      builder.append ("  this.").append (name).append (" = ").append (name).append (";\n"); 
      builder.append (" }\n"); 
     } 

     builder.append ("}\n"); 

     File dir = new File (
      packageName.replaceAll (
       "\\.", 
       Matcher.quoteReplacement (System.getProperty ("file.separator")))); 

     dir.mkdirs(); 

     BufferedWriter writer = new BufferedWriter (
      new OutputStreamWriter (
       new FileOutputStream (
        new File (dir, className + ".java")))); 

     writer.write (builder.toString()); 
     writer.close(); 
    } 

    public static void main (String [] args) throws Exception 
    { 
     Map <Class <?>, String> fields = new HashMap <Class<?>, String>(); 
     fields.put (int.class, "foo"); 
     fields.put (double.class, "bar"); 
     createClass ("my.pkg.MyClass", fields); 
    } 
} 
0

假設您想要生成Java源代碼並將其保存到.java文件中,您只需要迭代映射並根據需要輸出字段定義和setter/getter。

public String generateJava(String className, Map<String, Object> map) { 
    StringBuffer b = new StringBuffer("public class ").append(className).append(" {\n"); 
    // first fields 
    for (Entry<String, Object> field: map.entrySet()) { 
     String name = field.getKey(); 
     String type = field.getValue().getClass().getName(); 
     b.append("\tprivate ").append(type).append(" ").append(name).append(";\n"); 
    } 
    // then getters and setters 
    for (Entry<String, Object> field: map.entrySet()) { 
     String name = field.getKey(); 
     String type = field.getValue().getClass().getName(); 
     b.append("\n\n"); 
     // getter. 
     b.append("\tpublic ").append(type).append(" get").append(name.substring(0, 1).toUpperCase()).append(name.substring(1)).append("() {\n\t\t"); 
     b.append("return this.").append(name).append(";\n\t}"); 
     // setter. 
     b.append("\tpublic void").append(" set").append(name.substring(0, 1).toUpperCase()).append(name.substring(1)).append("(").append(type).append(" ").append(name).append(") {\n\t\t"); 
     b.append("this.").append(name).append(" = ").append(name).append(";\n\t}"); 
    } 
    return b.append("\n}").toString(); 
}