用反射获取内部类的属性其实很简单。。我弄了半天才弄好,由于很弱智的原因啊,写此博文已吸取教训。
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\\");
}
这样就没问题了!