首先了解一下反射的原理,什么是反射?所谓的反射就是指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. InnoDB逻辑存储结构

    从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace).表空间又由段(segment).区(extent).页(page)组成.页在一些文档中 ...

  2. C#获取特定进程CPU和内存使用率

    首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetCurrentProcess()方法来获取当前程序所对应的进程 ...

  3. IntelliJ IDEA快捷键:Shift+Esc

    Shift+Esc moves the focus to the editor and also hides the current (or last active) tool window. 将焦点 ...

  4. 【PAT】1032 Sharing (25)(25 分)

    1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...

  5. PHP编辑器分享

    Sublime 1 .安装了追踪插件,ctrl+鼠标左键点击PHP函数跳到函数声明的位置. 2.已汉化 链接:http://pan.baidu.com/s/1hs5qonE 密码:b8fw 相关文章: ...

  6. H5地理位置定位

    一:介绍使用的知识点 1.地理定位的原理 2.geolocation对象 3.Geolocation Api 4.getCurrentPosition的第一个参数 5.getCurrentPositi ...

  7. 怎么去除移动端点击a标签链接时的背景色

    在手机端点击链接时会发现有一个背景色,有时候需要改变这个颜色,或者去除这个颜色,有时候a标签做成按钮时这个颜色的存在会很丑,像这样: 可以通过 -webkit-tap-highlight-color: ...

  8. curl命令大全

    curl 命令行工具的使用及命令参数说明 curl是一个开源的用于数据传输的命令行工具与库,它使用URL语法格式,支持众多传输协议,包括:HTTP.HTTPS.FTP.FTPS.GOPHER.TFTP ...

  9. HashMap分析 + 哈希表

    http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html http://www.cnblogs.com/xqzt/archive/20 ...

  10. python 实现结构体

    # python 使用类创建结构体 class Myclass(object): class Struct(object): def __init__(self, name, age, job): s ...