首先了解一下反射的原理,什么是反射?所谓的反射就是指java 语言在运行时拥有一项自观的能力,反射能使你得到装载到 jvm 中的类的内部信息,它不需要你在编码的时候就知道所需类的内部信息,允许程序执行时才得到所需类的内部信息。反射能够构建灵活的应用的程序。

使用反射为bean 赋值 ,主要表现在几点,一:利用反射查找出bean类所有public方法,类定义的属性。二:如果是赋值,必须先判断属性类型,再逐个赋值,

三:调用method 类的invoke方法访问bean 的set 、get 方法设值、取值。

看下面代码:

  1. package com.reflect;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.Locale;
  8. import java.util.Map;
  9. public class ReflectGetValue {
  10. /**
  11. * 取出bean 属性和值
  12. * @param obj
  13. * @return
  14. * @throws Exception
  15. */
  16. public static Map<Object,Object> getFileValue(Object obj) throws Exception{
  17. Map<Object, Object> map = new HashMap<Object, Object>();
  18. Class<?> cls = obj.getClass();
  19. Method methods[] = cls.getDeclaredMethods();
  20. Field fields[] = cls.getDeclaredFields();
  21. for(Field field:fields){
  22. String fldtype = field.getType().getSimpleName();
  23. String getMetName = pareGetName(field.getName());
  24. String result ="";
  25. if(!checkMethod(methods,getMetName)){
  26. continue;
  27. }
  28. Method method = cls.getMethod(getMetName, null);
  29. Object object = method.invoke(obj, new Object[]{});
  30. if(null != object){
  31. if(fldtype.equals("Date")){
  32. result = fmlDate((Date)object);
  33. }
  34. result = String.valueOf(object);
  35. }
  36. map.put(field.getName(), result);
  37. }
  38. return map;
  39. }
  40. /**
  41. * 设置bean 属性值
  42. * @param map
  43. * @param bean
  44. * @throws Exception
  45. */
  46. public static void setFieldValue(Map<Object, Object> map, Object bean) throws Exception{
  47. Class<?> cls = bean.getClass();
  48. Method methods[] = cls.getDeclaredMethods();
  49. Field fields[] = cls.getDeclaredFields();
  50. for(Field field:fields){
  51. String fldtype = field.getType().getSimpleName();
  52. String fldSetName = field.getName();
  53. String setMethod = pareSetName(fldSetName);
  54. if(!checkMethod(methods, setMethod)){
  55. continue;
  56. }
  57. Object value = map.get(fldSetName);
  58. System.out.println(value.toString());
  59. Method method = cls.getMethod(setMethod, field.getType());
  60. System.out.println(method.getName());
  61. if(null != value){
  62. if("String".equals(fldtype)){
  63. method.invoke(bean, (String)value);
  64. }else if("Double".equals(fldtype)){
  65. method.invoke(bean, (Double)value);
  66. }else if("int".equals(fldtype)){
  67. int val = Integer.valueOf((String)value);
  68. method.invoke(bean, val);
  69. }
  70. }
  71. }
  72. }
  73. /**
  74. * 拼接某属性get 方法
  75. * @param fldname
  76. * @return
  77. */
  78. public static String pareGetName(String fldname){
  79. if(null == fldname || "".equals(fldname)){
  80. return null;
  81. }
  82. String pro = "get"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);
  83. return pro;
  84. }
  85. /**
  86. * 拼接某属性set 方法
  87. * @param fldname
  88. * @return
  89. */
  90. public static String pareSetName(String fldname){
  91. if(null == fldname || "".equals(fldname)){
  92. return null;
  93. }
  94. String pro = "set"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);
  95. return pro;
  96. }
  97. /**
  98. * 判断该方法是否存在
  99. * @param methods
  100. * @param met
  101. * @return
  102. */
  103. public static boolean checkMethod(Method methods[],String met){
  104. if(null != methods ){
  105. for(Method method:methods){
  106. if(met.equals(method.getName())){
  107. return true;
  108. }
  109. }
  110. }
  111. return false;
  112. }
  113. /**
  114. * 把date 类转换成string
  115. * @param date
  116. * @return
  117. */
  118. public static String fmlDate(Date date){
  119. if(null != date){
  120. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.US);
  121. return sdf.format(date);
  122. }
  123. return null;
  124. }
  125. }
  126. ----------------------------------
    1. 测试方法
    2. public static void main(String[] args) {
    3. try {
    4. Map<Object, Object> map = new HashMap<Object, Object>();
    5. map.put("yi", "reyo");
    6. map.put("san", "27");
    7. map.put("er", "2010-10-24");
    8. Bean bean = new Bean();
    9. ReflectGetValue.setFieldValue(map, bean);
    10. Map<Object, Object> m= ReflectGetValue.getFileValue(bean);
    11. System.out.println(m.toString());
    12. } catch (Exception e) {
    13. e.printStackTrace();
    14. }
    15. }

java 反射原理写了一个赋值和取值通用类的更多相关文章

  1. Java反射 - 简单的给Bean赋值和取值

    由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子. 工具类BeanRefUtil:   package c ...

  2. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  3. jquery input 赋值和取值

    记录一下: 在写一个input赋值,二话不说就直接利用了$('#xx').val()来进行取值和赋值,取值ok,赋值后利用alert显示正确,但是在html上并没有正确的显示出来,后来改为使用如下代码 ...

  4. js实现hashtable的赋值、取值、遍历

    哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值.取值.遍历.排序操作提高效率.想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面 ...

  5. 实用ExtJS教程100例-011:ExtJS Form 使用JSON数据赋值和取值

    上一节中我们演示了ExtJS Form的异步加载和提交数据,本节中我们将演示如何使用JSON数据为ExtJS Form中的字段赋值和取值. 系列ExtJS教程持续更新中,点击查看>>最新E ...

  6. 通过编写串口助手工具学习MFC过程——(十)UpdateData()用法和编辑框的赋值、取值

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  7. 关于ligerform中select与text的赋值与取值

    如有下ligerform表单: var formData = [ { display: "区域", name: "QYYJ", newline: true, l ...

  8. Jquery实现数据双向绑定(赋值和取值),类似AngularJS

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  9. java map添加另一个map时候 键值对的类型要一致

    java map添加另一个map时候 键值对的类型要一致

随机推荐

  1. spring-mvc集成 swagger

    问题1:spring-mvc集成 swagger, 配置好后界面 404, 原因: dispatcher-servlet.xml 文件中, 要在这上面 <!-- 启用spring mvc 注解 ...

  2. android短信验证

    短信验证demo http://download.csdn.net/detail/crazy1235/8315279#comment 使用MOB平台开发,用法详见: http://blog.csdn. ...

  3. SqlServer行转列(PIVOT),列转行(UNPIVOT)总结

    PIVOT用于将列值旋转为列名(即行转列) 语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list ...

  4. Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. dojo 加载自定义module的路径问题

    因为最近想学学ArcGIS API for JavaScript ,翻了下ESRI的官网guide,发现其是基于dojo框架的,看了两页实在看不懂,于是先来熟悉下dojo框架.人蠢不能怪社会%> ...

  6. HBase0.99.2集群的搭建步骤(在hadoop2.6.4集群和zookeeper3.4.5集群上)

    HBase介绍(NoSql,不是关系型数据库) HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. HBase ...

  7. PHP文件上传及下载源码

    一.文件上传 前台页面: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. P1540 机器翻译 模拟

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  9. hibernate Validator 6.X 的学习,bean的约束(主要包括的是容器元素的验证)

    1. 四:案例二(property的验证) 1.

  10. tornado登陆装饰器

    tornado作为鼎鼎大名的web异步框架,用来作为高性能服务器以及web框架都是首选.自从python3.4加入了asyncio原生协程后,tornado的最新版本也开始使用了原生的协程.定义协程函 ...