我通过将数据类型和字段名称传递给我的方法来动态创建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 :(得分:2)
由于在编译时不知道类,因此访问它的唯一方法是通过反射。
我不知道您是如何编写createClass
但是如果您设法创建一个扩展编译时已知的另一个类的类,那么您可以使用多态来访问其 methods
< / em>没有反思。
答案 1 :(得分:0)
这是一个例外,我建议恢复到JavaScript或BeanShell(类似脚本的java)。可以使用Java Scripting API完成与java的互操作。
但是,javassist(AOP /字节代码)可能正是您要搜索的内容,但很复杂。