在不使用反射API的情况下在JAVA中创建Dynamic类?

时间:2014-02-11 12:31:42

标签: java string class generics io

我通过将数据类型和字段名称传递给我的方法来动态创建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);
}
}

现在我想要动态地传递这些值我该怎么做。

2 个答案:

答案 0 :(得分:2)

由于在编译时不知道类,因此访问它的唯一方法是通过反射。

我不知道您是如何编写createClass但是如果您设法创建一个扩展编译时已知的另一个类的类,那么您可以使用多态来访问其 methods < / em>没有反思。

答案 1 :(得分:0)

这是一个例外,我建议恢复到JavaScript或BeanShell(类似脚本的java)。可以使用Java Scripting API完成与java的互操作。

但是,javassist(AOP /字节代码)可能正是您要搜索的内容,但很复杂。