我通过将数据类型和字段名称传递给我的方法动态创建了一个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/