用反射获取内部类的属性其实很简单。。我弄了半天才弄好,由于很弱智的原因啊,写此博文已吸取教训。
main方法是:
虽简单,但是太坑爹了,getFields()只能获取public的字段,包括父类的。
而getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
而我写的Characters类中的属性是在继承父类的,父类中是protected的,所以获取不到,这个弄了我半天!最后只要把父类的protected属性全改成public的就ok了啊。。
还有getFields()和getDeclaredFields(),返回的都是Field对象,获取名称直接field.getName(),但是属性值则是field.get(Object),这个object是该field所属的!!!
太坑爹了,绕了好多弯啊!!!不过这样却对反射获得字段有了深刻的理解。
具体代码如下:
/**
* 生成java实体类的核心方法
* @param clazz
* @param targetDir
* @throws Exception
*/
private void genFileHandler(Class<?> clazz, String targetDir) throws Exception {
/* 1,获取模板 */
Template temp = configuration.getTemplate("testEntity.ftl", pageEncoding);
temp.setEncoding(pageEncoding);
/* 2,设置模板的数据内容Map */
// 获取相关名称
String entityName = getEntityName(clazz);
String enumName = clazz.getSimpleName();
String tableName = getTableName(clazz);
// 填充Map
Map<String, Object> targetClazz = new HashMap<String, Object>();
Map<String, Map<String, String>> fields = new HashMap<String, Map<String, String>>();
targetClazz.put("entityName", entityName);
targetClazz.put("enumName", enumName);
targetClazz.put("tableName", tableName);
targetClazz.put("fields", fields);
// 获得所有枚举字段成员(id, account, name, profession...),
// 遍历每个枚举成员,获取属性,放入Map中
Object[] enums = clazz.getEnumConstants();
for (Object e : enums) {
Map<String, String> field = new HashMap<String, String>();
String name = e.toString();
Class<?> type = (Class<?>) getFieldValue(clazz, e, "type");
field.put("name", name);
field.put("type", type.getSimpleName());
fields.put(e.toString() + "field", field);
}
// 判断目标文件夹不存在,则新建文件夹
File dir = new File(targetDir);
if(!dir.exists()) dir.mkdirs();
/* 3,将模板和数据合并,并生成文件 */
String fileName = targetDir + entityName + ".java";
System.out.println("-------开始生成" + fileName + "文件......------");
File target = new File(fileName);
Writer out = new OutputStreamWriter(new FileOutputStream(target), pageEncoding);
temp.process(targetClazz, out);
out.flush();
out.close();
System.out.println("-------" + fileName + "文件生成完毕!-------");
}
还有其父类部分代码改过之后是:
public abstract class EntityConfCommon {
public Class<?> type;
public int length;
public String index;
public String defaults;
public boolean isNull;
main方法是:
public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException, InstantiationException {
Class<Character> c = Character.class;
FreemarkerGenEntity generator = new FreemarkerGenEntity();
generator.init();
generator.genFile(c, "d:\\test\\");
}
这样就没问题了!