2014-02-11 82 views
0

我通過將數據類型和字段名稱傳遞給我的方法來動態創建java類文件。現在我想動態地(從控制檯)傳遞相同的值,我該怎麼做。在不使用反射API的情況下在JAVA中創建動態類?

下面是我的代碼:

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"); // I wnat to pass these values from console 
    fields.put(char.class, "me"); 
    fields.put(int.class, "i"); 
    createClass("my.pkg.MyClass1", fields); 
} 
} 

現在我要動態傳遞這些價值我該怎麼辦。

+0

我可以問你爲什麼這樣做?就像我討厭他們一樣,在這裏'Map'可能是更好的選擇。 –

回答

2

由於在編譯時不知道該類,因此訪問它的唯一方法是反射。

我不知道你是如何寫createClass但如果你成功地創建一個擴展在編譯時已知的其他類的類,那麼你可以使用多態訪問其methods無反射。

+0

由於語言問題,我恐怕無法理解您的問題。你能否用你想要做的樣本代碼更新你的問題? –

+0

sure @Misrable Variable – Prabha

+0

所以'createClass'只是創建一個源文件。它如何被編譯?您需要在其上運行'javac',並確保生成的'.class'文件位於'classpath'中。無論如何,我不明白你如何不經過反思就能訪問其成員。 –

0

這是一個例外,我會建議恢復到JavaScript或BeanShell(java像腳本)等。與Java的互操作可以使用Java Scripting API完成。

然而,也許javassist(AOP /字節碼)可能是你正在尋找,雖然很複雜。

+0

謝謝@Joop Eggen 我得到了結果,但不是傳遞字段類型(int.class,..)我想從控制檯讀取這是我想要的。 – Prabha

相關問題