![](/img/trans.png)
[英]Dynamically class creating by using Java Reflection, java.lang.ClassNotFoundException
[英]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.