用反射获取内部类的属性其实很简单。。我弄了半天才弄好,由于很弱智的原因啊,写此博文已吸取教训。
虽简单,但是太坑爹了,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">
-
-
-
-
-
- private void genFileHandler(Class<?> clazz, String targetDir) throws Exception {
-
- Template temp = configuration.getTemplate("testEntity.ftl", pageEncoding);
- temp.setEncoding(pageEncoding);
-
-
-
- String entityName = getEntityName(clazz);
- String enumName = clazz.getSimpleName();
- String tableName = getTableName(clazz);
-
-
- 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);
-
-
-
- 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();
-
-
- 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\\");
-
- }