![](/img/trans.png)
[英]How to access a private field of the super class of the super class with reflection in Java?
[英]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.