假设我有以下类别:
public abstract class A<T> implements Serializable {
}
public class B extends A<Long> {
}
public class C extends B {
}
public class D {
public C c;
}
然后,我想使用以下代码和模板生成代码:
private static void generateJavaCode(Class clazz) {
try {
Configuration cfg = new Configuration();
FileTemplateLoader ftl1 = new FileTemplateLoader(new File("E:/templates/code/"));
cfg.setTemplateLoader(ftl1);
Template template = cfg.getTemplate(tmpl);
Map<String, Object> data = new HashMap<String, Object>();
String modelPackage = clazz.getPackage().getName();
data.put("fields", clazz.getDeclaredFields());
File f = new File(filePath);
String absolutePath = f.getAbsolutePath();
String ffilePath = absolutePath.substring(0, absolutePath.lastIndexOf(File.separator));
new File(ffilePath).mkdirs();
Writer file = new FileWriter(f);
template.process(data, file);
file.flush();
file.close();
}
catch (Exception e) {
}
}
这是.ftl
文件的内容:
<#list fields as field>
<#attempt>
field.superclass.superclass
<#recover>
field.superclass
</#attempt>
</#list>
但是field.superclass.superclass
不起作用,我该如何解决这个问题?
答案 0 :(得分:0)
假设您的“clazz”变量是您声明的“D”类的实例。用:
data.put("fields", clazz.getDeclaredFields());
您将Field []对象(从Class.getDeclaredFields()返回)分配给“fields”,而不是Class []。由于Field类没有'超类'getter,因此.ftl中的代码会导致异常:
${field.superclass} // it does not work
但是Field类有一个方法getDeclaringClass(),它提供了一个Class引用。然后你可以从你的freemarker中调用它,如下所示:
${field.declaringClass // return: C
${field.declaringClass.superclass} // return: B
${field.declaringClass.superclass.superclass} // return: A