簡體   English   中英

如何通過java反射在freemarker模板中獲取一級超類?

[英]How to get first level super class in freemarker template by java reflection?

假設我有以下這些課程:

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不起作用,我該如何解決這個問題?

假設您的“ clazz”變量是您聲明的“ D”類的實例。 附:

data.put("fields", clazz.getDeclaredFields());

您將Field []對象(從Class.getDeclaredFields()返回分配給“字段”,而不是Class []。 由於Field類沒有“超類”吸氣劑,因此.ftl中的代碼會導致異常:

${field.superclass} // it does not work

但Field類具有方法getDeclaringClass() ,該方法提供了Class引用。 那么您可以通過以下方式從您的免費標記中調用它:

${field.declaringClass // return: C 
${field.declaringClass.superclass} // return: B
${field.declaringClass.superclass.superclass} // return: A

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM