java - 在 JAVA 中创建动态类而不使用反射 API?

标签 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);
}
}

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

最佳答案

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

我不知道你是如何编写 createClass 但如果你设法创建一个扩展另一个在编译时已知的类的类,那么你可以使用多态性来访问它的 方法没有反射。

关于java - 在 JAVA 中创建动态类而不使用反射 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21701923/

相关文章:

java - 将 String 转换为 Unicode 时的数组大小问题

Java 线程转储 : java. lang.Thread.State:WAITING(在对象监视器上)

java - TDD 中的模拟值

c++ - 为什么在比较字符串时出现错误 "no match for ' operator= =' "?

class - "Statement is not accessible"本地类声明后出错

python - 支持类的 .send() 吗?

Java 分配类值

python - 当大写字符前面有小写字符时,如何从字符串末尾删除大写字符?

java - Freemarker 模板光标定位在特定点

c++ - 使此代码正确多态