getFields()只能获取public的字段,包括父类的。
而getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
而我写的Characters类中的属性是在继承父类的,父类中是protected的,所以获取不到,这个弄了我半天!最后只要把父类的protected属性全改成public的就ok了啊。。
还有getFields()和getDeclaredFields(),返回的都是Field对象,获取名称直接field.getName(),但是属性值则是field.get(Object),这个object是该field所属的!!!
太坑爹了,绕了好多弯啊!!!不过这样却对反射获得字段有了深刻的理解。
具体代码如下:
- <pre name="code" class="java">/**
- * 生成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 + "文件生成完毕!-------");
- }</pre><br>
- <br>
- <pre></pre>
还有其父类部分代码改过之后是:
- 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\\");
- }