反射获取对象成员的字段值,getFields()和getDeclaredFields()用法区别

用反射获取内部类的属性其实很简单。。我弄了半天才弄好,由于很弱智的原因啊,写此博文已吸取教训。
  虽简单,但是太坑爹了,getFields()只能获取public的字段,包括父类的。
  而getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
  而我写的Characters类中的属性是在继承父类的,父类中是protected的,所以获取不到,这个弄了我半天!最后只要把父类的protected属性全改成public的就ok了啊。。

  还有getFields()和getDeclaredFields(),返回的都是Field对象,获取名称直接field.getName(),但是属性值则是field.get(Object),这个object是该field所属的!!!

  太坑爹了,绕了好多弯啊!!!不过这样却对反射获得字段有了深刻的理解。
  具体代码如下:
[java]  view plain  copy
 print ?
  1. <pre name="code" class="java">/** 
  2.      * 生成java实体类的核心方法 
  3.      * @param clazz 
  4.      * @param targetDir 
  5.      * @throws Exception  
  6.      */  
  7.     private void genFileHandler(Class<?> clazz, String targetDir) throws Exception {  
  8.         /* 1,获取模板 */  
  9.         Template temp = configuration.getTemplate("testEntity.ftl", pageEncoding);  
  10.         temp.setEncoding(pageEncoding);  
  11.           
  12.         /* 2,设置模板的数据内容Map */  
  13.         // 获取相关名称  
  14.         String entityName = getEntityName(clazz);  
  15.         String enumName = clazz.getSimpleName();  
  16.         String tableName = getTableName(clazz);  
  17.           
  18.         // 填充Map  
  19.         Map<String, Object> targetClazz = new HashMap<String, Object>();  
  20.         Map<String, Map<String, String>> fields = new HashMap<String, Map<String, String>>();  
  21.         targetClazz.put("entityName", entityName);  
  22.         targetClazz.put("enumName", enumName);  
  23.         targetClazz.put("tableName", tableName);  
  24.         targetClazz.put("fields", fields);  
  25.           
  26.         // 获得所有枚举字段成员(id, account, name, profession...),  
  27.         // 遍历每个枚举成员,获取属性,放入Map中  
  28.         Object[] enums = clazz.getEnumConstants();  
  29.         for (Object e : enums) {  
  30.             Map<String, String> field = new HashMap<String, String>();  
  31.             String name = e.toString();  
  32.             Class<?> type = (Class<?>) getFieldValue(clazz, e, "type");  
  33.               
  34.             field.put("name", name);  
  35.             field.put("type", type.getSimpleName());  
  36.             fields.put(e.toString() + "field", field);  
  37.         }  
  38.           
  39.         // 判断目标文件夹不存在,则新建文件夹  
  40.         File dir = new File(targetDir);  
  41.         if(!dir.exists())   dir.mkdirs();  
  42.           
  43.         /* 3,将模板和数据合并,并生成文件 */  
  44.         String fileName = targetDir + entityName + ".java";  
  45.         System.out.println("-------开始生成" + fileName + "文件......------");  
  46.           
  47.         File target = new File(fileName);  
  48.         Writer out = new OutputStreamWriter(new FileOutputStream(target), pageEncoding);  
  49.         temp.process(targetClazz, out);  
  50.         out.flush();  
  51.         out.close();  
  52.   
  53.         System.out.println("-------" + fileName + "文件生成完毕!-------");  
  54.     }</pre><br>  
  55. <br>  
  56. <pre></pre>  

还有其父类部分代码改过之后是:
[java]  view plain  copy
 print ?
  1. public abstract class EntityConfCommon {  
  2.     public Class<?> type;  
  3.     public int length;  
  4.     public String index;  
  5.     public String defaults;  
  6.     public boolean isNull;  

main方法是:
[java]  view plain  copy
 print ?
  1. public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException, InstantiationException {  
  2.     Class<Character> c = Character.class;  
  3.   
  4.     FreemarkerGenEntity generator = new FreemarkerGenEntity();  
  5.     generator.init();  
  6.     generator.genFile(c, "d:\\test\\");  
  7.       
  8. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值