反射 判断属性类型

引用:http://blog.chinaunix.net/uid-26863299-id-3578280.html

  1. package com .cn .fanjg .rtti ;
  2. import java .lang .reflect .Field ;
  3. import java .lang .reflect .InvocationTargetException ;
  4. import java .lang .reflect .Method ;
  5. import java .util .regex .Matcher ;
  6. import java .util .regex .Pattern ;
  7. /**
    • @function:
    • @date : 2013-4-10 下午03:28:53
  8. */
  9. @SuppressWarnings (“rawtypes”)
  10. public class AssignValueForAttributeUtil {
  11. / 正则表达式 用于匹配属性的第一个字母 {@value [a-zA-Z]} /
  12. private static final String REGEX =”[a-zA-Z]”;
  13. public static void setAttrributeValue (Object obj ,String attribute ,Object value )
  14. {
  15. String method_name = convertToMethodName (attribute ,obj .getClass (),true );
  16. Method [] methods = obj .getClass ().getMethods ();
  17. for (Method method : methods ){
  18. /**
    • 因为这里只是调用bean中属性的set方法,属性名称不能重复
    • 所以set方法也不会重复,所以就直接用方法名称去锁定一个方法
    • (注:在java中,锁定一个方法的条件是方法名及参数)
    • **/
  19. if (method .getName ().equals (method_name ))
  20. {
  21. Class [] parameterC =method .getParameterTypes ();
  22. try {
  23. /**如果是基本数据类型时(如int、float、double、byte、char、boolean)
    • 需要先将Object转换成相应的封装类之后再转换成对应的基本数据类型
    • 否则会报 ClassCastException**/
  24. if (parameterC [0 ]==int .class )
  25. {
  26. method .invoke (obj ,((Integer )value ).intValue ());
  27. break ;
  28. }else if (parameterC [0 ]==float .class ){
  29. method .invoke (obj ,((Float )value ).floatValue ());
  30. break ;
  31. }else if (parameterC [0 ]==double .class )
  32. {
  33. method .invoke (obj ,((Double )value ).doubleValue ());
  34. break ;
  35. }else if (parameterC [0 ]==byte .class )
  36. {
  37. method .invoke (obj ,((Byte )value ).byteValue ());
  38. break ;
  39. }else if (parameterC [0 ]==char .class )
  40. {
  41. method .invoke (obj ,((Character )value ).charValue ());
  42. break ;
  43. }else if (parameterC [0 ]==boolean .class )
  44. {
  45. method .invoke (obj ,((Boolean )value ).booleanValue ());
  46. break ;
  47. }else
  48. {
  49. method .invoke (obj ,parameterC [0 ].cast (value ));
  50. break ;
  51. }
  52. }catch (IllegalArgumentException e ){
  53. e .printStackTrace ();
  54. }catch (IllegalAccessException e ){
  55. e .printStackTrace ();
  56. }catch (InvocationTargetException e ){
  57. e .printStackTrace ();
  58. }catch (SecurityException e ){
  59. e .printStackTrace ();
  60. }
  61. }
  62. }
  63. }
  64. private static String convertToMethodName (String attribute ,Class objClass ,boolean isSet )
  65. {
  66. / 通过正则表达式来匹配第一个字符 /
  67. Pattern p =Pattern .compile (REGEX );
  68. Matcher m = p .matcher (attribute );
  69. StringBuilder sb =new StringBuilder ();
  70. / 如果是set方法名称 /
  71. if (isSet )
  72. {
  73. sb .append (“set”);
  74. }else {
  75. / get方法名称 /
  76. try {
  77. Field attributeField = objClass .getDeclaredField (attribute );
  78. / 如果类型为boolean /
  79. if (attributeField .getType ()==boolean .class ||attributeField .getType ()==Boolean .class )
  80. {
  81. sb .append (“is”);
  82. }else
  83. {
  84. sb .append (“get”);
  85. }
  86. }catch (SecurityException e ){
  87. e .printStackTrace ();
  88. }catch (NoSuchFieldException e ){
  89. e .printStackTrace ();
  90. }
  91. }
  92. / 针对以下划线开头的属性 /
  93. if (attribute .charAt (0 )!=’_’&& m .find ())
  94. {
  95. sb .append (m .replaceFirst (m .group ().toUpperCase ()));
  96. }else {
  97. sb .append (attribute );
  98. }
  99. return sb .toString ();
  100. }
  101. public static Object getAttrributeValue (Object obj ,String attribute )
  102. {
  103. String methodName = convertToMethodName (attribute , obj .getClass (), false );
  104. Object value =null ;
  105. try {
  106. / 由于get方法没有参数且唯一,所以直接通过方法名称锁定方法 /
  107. Method methods = obj .getClass ().getDeclaredMethod (methodName );
  108. if (methods !=null )
  109. {
  110. value = methods .invoke (obj );
  111. }
  112. }catch (SecurityException e ){
  113. e .printStackTrace ();
  114. }catch (NoSuchMethodException e ){
  115. e .printStackTrace ();
  116. }catch (IllegalArgumentException e ){
  117. e .printStackTrace ();
  118. }catch (IllegalAccessException e ){
  119. e .printStackTrace ();
  120. }catch (InvocationTargetException e ){
  121. e .printStackTrace ();
  122. }
  123. return value ;
  124. }
  125. }

Original: https://www.cnblogs.com/sode/p/3229189.html
Author: 镇水古月
Title: 反射 判断属性类型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/544063/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 内存分析器 (MAT)

    内存分析器 (MAT) 1.1 MAT介绍 MAT是Memory Analyzer tool的缩写。指分析工具。 1.2 MAT作用 Eclipse Memory Analyzer…

    Java 2023年6月8日
    071
  • 1、SOA开始

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/weiapro/p/7801545.htmlAuthor…

    Java 2023年6月13日
    076
  • 对于Java中权限修饰符的理解

    老是把Java中权限修饰符给忘记,写一个博客加深印象吧 权限分为四个作用域:当前类,同一个包,其他包的子类,其他包的类。 首先要知道包的概念,Java中一个包是指一个package…

    Java 2023年6月15日
    066
  • Spring(一)——下载与测试

    Spring(一)——下载与测试 安装jar包 网页输入spring.io回车 测试案例 新建一个普通的Java工程 导入以下jar包 ​ commons-logging-1.2….

    Java 2023年6月16日
    080
  • Java 数组综合应用

    Java 数组综合应用 需求 已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序, 随机生成10个1-100整数保存到数组,并降序打印及求平均值、最大值和最大值下标、并查找…

    Java 2023年6月5日
    0102
  • Nacos学习

    1、一文详解 Nacos 高可用特性 2、Nacos 集群部署模式最佳实践 摘要: nacos客户端重试机制: 逻辑非常简单,拿到地址列表,在请求成功之前逐个尝试,直到成功为止。该…

    Java 2023年6月5日
    088
  • 设计模式实战(二)(单例模式)

    设计模式实战 👾设计模式demo实战。 项目地址:https://github.com/bearbrick0/designpattern 🫑创建型设计模式 创建型的设计模式包括:单…

    Java 2023年6月5日
    087
  • 用无感知的方式为你的数据加上一层缓存

    前言 本篇文章会介绍一个我自己写的库,库地址在这里,主要作用是提供一个注解,在你方法上使用这个注解,库提供的功能会帮你把数据自动缓存起来,下次再调用这个方法只要入参是一致的则直接会…

    Java 2023年6月5日
    083
  • java数字格式化DecimalFormat

    保留两位有效数字可以使用DecimalFormat来实现; String str = "195.1"; BigDecimal bigDecimal = new …

    Java 2023年5月29日
    086
  • nginx使用与配置入门指南

    这是一篇关于nginx使用与配置的入门指南,但不包括nginx的编译与安装。我假定你知晓如何安装nginx。对大多数Linux系统来说,nginx都已经存在于它们的软件包里,直接使…

    Java 2023年5月30日
    092
  • 11.NIO核心三:选择器(Selector)

    4.接收:SelectionKey.OP_ACCEPT; NIO非阻塞式网络通信的原理分析 服务端&#x6…

    Java 2023年6月5日
    080
  • 深入MySQL(二):MySQL的数据类型

    对于MySQL中的数据类型的选择,不同的数据类型看起来可能是相同的效果,但是其实很多时候天差地别。本章从MySQL中的 常用类型出发,结合 类型选择的常见错误,贯彻MySQL的常用…

    Java 2023年6月7日
    0104
  • DNS分离解析IPV6与IPV4用户

    IPV6改造中经常会遇到,网站使用了CDN,但是CDN厂商还不支持IPV6的情况,而AAAA、A、CNAME记录互相冲突,想实现IPV6用户得到AAAA记录,IPV4用户得到CNA…

    Java 2023年6月5日
    076
  • Spring事物源码

    http://lgbolgger.iteye.com/blog/2180251 Original: https://www.cnblogs.com/daxin/p/5147990….

    Java 2023年5月30日
    066
  • Lombok

    Lombok项目是一个 Java 库,它会自动插入编辑器和构建工具中,Lombok 提供了一组有用的注释,用来消除Java类中的大量样板代码。 常用注解 可以在记录组件或方法或构造…

    Java 2023年6月8日
    061
  • IDEA使用JDBC链接MySql(java编程)

    1、在Maven的pom.xml文件中引入MySql的驱动 2、idea(版本:2021.2.2)JDBC链接MySql数据库 3、编写JDBC代码 : Original: htt…

    Java 2023年6月7日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球