如何通过java反射获取freemarker模板中的第一级supper类?

时间:2015-04-07 05:50:54

标签: java reflection freemarker

假设我有以下类别:

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不起作用,我该如何解决这个问题?

1 个答案:

答案 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