簡體   English   中英

在不使用反射API的情況下在JAVA中創建Dynamic類?

[英]Creating Dynamic class in JAVA without using reflection 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);
}
}

現在我想要動態傳遞這些值我該怎么辦。

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

我不知道你是如何編寫createClass但如果你設法創建一個擴展編譯時已知的另一個類的類,那么你可以使用多態來訪問它的methods而不用反射。

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

然而,也許javassist (AOP /字節代碼)可能是您正在搜索的內容,盡管很復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM