繁体   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