java的反射机制属实强大,能解决好些问题

在接手别人写的代码的时候,有一个bean类的get方法特别low,我都看不下去

重复代码写五遍,我都觉得太不合理。之后将其中代码抽取出来修改了下。

public List<Map<String, String>> getNewAnswer() {List<Map<String, String>> temp = new ArrayList<Map<String, String>>();Map<String, String> mapA = new HashMap<String, String>();Map<String, String> mapB = new HashMap<String, String>();Map<String, String> mapC = new HashMap<String, String>();Map<String, String> mapD = new HashMap<String, String>();Map<String, String> mapE = new HashMap<String, String>();String em = getExamMine();Boolean ba, bb, bc, bd, be;ba = bb = bc = bd = be = false;if(!StringUtils.isEmpty(em)) {ba = em.indexOf("A") != -1;bb = em.indexOf("B") != -1;bc = em.indexOf("C") != -1;bd = em.indexOf("D") != -1;be = em.indexOf("E") != -1;}mapA.put("name", "A");//开始 改变图片路径Matcher m = p.matcher(getAnswerA());if(m.find()) {mapA.put("img","/webq/"+this.productType+"/"+m.group().substring(1, m.group().length()-1));}else{mapA.put("value", getAnswerA());}mapA.put("checked", ba.toString());mapB.put("name", "B");m = p.matcher(getAnswerB());if(m.find()) {mapB.put("img","/webq/"+this.productType+"/"+m.group().substring(1, m.group().length()-1));}else{mapB.put("value", getAnswerB());}mapB.put("checked", bb.toString());mapC.put("name", "C");m = p.matcher(getAnswerC());if(m.find()) {mapC.put("img","/webq/"+this.productType+"/"+m.group().substring(1, m.group().length()-1));}else{mapC.put("value", getAnswerC());}mapC.put("checked", bc.toString());mapD.put("name", "D");m = p.matcher(getAnswerD());if(m.find()) {mapD.put("img","/webq/"+this.productType+"/"+m.group().substring(1, m.group().length()-1));}else{mapD.put("value", getAnswerD());}mapD.put("checked", bd.toString());mapE.put("name", "E");m = p.matcher(getAnswerE());if(m.find()) {mapE.put("img","/webq/"+this.productType+"/"+m.group().substring(1, m.group().length()-1));}else{mapE.put("value", getAnswerE());}mapE.put("checked", be.toString());temp.add(mapA);temp.add(mapB);temp.add(mapC);temp.add(mapD);temp.add(mapE);return temp;}

将其中的相同代码抽出来有个问题,对于调用方法可咋整。

比如getAnswerA getAnswerB,这怎么动态调用。反射这个时候就用到了。

public Map<String, String> getAnswerMap(String option,Boolean f2){Map<String, String> map = new HashMap<String, String>();    String em = getExamMine();    Boolean flag = false;if(!StringUtils.isEmpty(em)) {flag = em.indexOf(option) != -1;}if(f2){map.put("checked", String.valueOf(false));}else{map.put("checked", flag.toString());}map.put("name", option);System.out.println(getAnswerA());String f = "getAnswer"+option;try {Method method = QuestionsDto.class.getDeclaredMethod(f, null);method.setAccessible(true);Object object = method.invoke(this, null);Matcher m = p.matcher(object.toString());if(m.find()) {map.put("img","/webq/"+this.productType+"/"+m.group().substring(1, m.group().length()-1));}else{map.put("value", object.toString());}} catch (Exception e) {e.printStackTrace();}return map;}

getNewAnswer就变成了这

public List<Map<String, String>> getNewAnswer() {List<Map<String, String>> temp = new ArrayList<Map<String, String>>(); temp.add(getAnswerMap("A",true));temp.add(getAnswerMap("B",true));temp.add(getAnswerMap("C",true));temp.add(getAnswerMap("D",true));temp.add(getAnswerMap("E",true));return temp;}

如此简练明了。

之前使用的反射也挺多,有时候根据对应的全类名来获取,这个可用性很大。new对象的话再getclass最多就是用在别人封装好的方法

这次使用的时候蒙了,从数据库查出来怎么在本类使用反射,this.getClass获取到的是空啊。一开始是根据属性取值,最后想了下,还没有调用set方法怎么能有值

最后使用

Method method = QuestionsDto.class.getDeclaredMethod(f, null);method.setAccessible(true);Object object = method.invoke(this, null);

直接传this即可。

之前做过一个跨域审批的功能,对于现有的类进行操作,没问题,之后让我修改为通用的,针对于不同的类也要求适用,蒙了。

这个时候反射又用到了,可以将bean类放入固定的包名下面,只有根据数据库的表明以及对应包的路径名称来获取到全类名,之后获取到对应的字节码文件之后

获取实例获取对应的属性,进行一系列的操作。

反射用处着实很大。

转载于:https://www.cnblogs.com/chywx/p/9458543.html

java反射,代码优化相关推荐

  1. 聊聊我们Java中代码优化的30个小技巧

    今天我们一起聊聊Java中代码优化的30个小技巧,希望会对你有所帮助. 1.用String.format拼接字符串 不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情况. 比如现在有个 ...

  2. Java中代码优化的30个小技巧

    1.用String.format拼接字符串 String.format方法拼接url请求参数,日志打印等字符串. 但不建议在for循环中用它拼接字符串,因为它的执行效率,比使用+号拼接字符串,或者使用 ...

  3. Java 中代码优化的 30 个小技巧(上)

    前言 今天我们一起聊聊 Java 中代码优化的 30 个小技巧,希望会对你有所帮助. 1 用 String.format 拼接字符串 不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情 ...

  4. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  5. java反射最佳实践,java反射性能测试分析

    java反射性能测试分析 java有别于其他编程语言而让我着迷的特性有很多,其中最喜欢的是接口设计,他让我们设计的东西具有美感.同样反射也是我比较喜欢的一个特性,他让程序自动运行,动态加载成为了可能, ...

  6. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  7. Java反射以及应用

    需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有.共有 ...

  8. java反射用在哪里_Java反射

    昨天去参加比赛了,所以没有进行博客迁移.人生中的第一场健体比赛,虽然没得奖,但是收获和带来的思考颇丰.意外地进入了男子B组(174以上)的半决赛,然后在半决赛的时候还被裁判员点名出去单独比较,这个很让 ...

  9. Java反射(详述版)

    一.什么是反射? 我们先来看一个例子: package venus; public class Student {public String name;public Student(){System. ...

  10. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

最新文章

  1. Win32 API 窗口版本转换度分秒为小数
  2. 数据库MySQL关系模型之基本概念
  3. The Excel Connection Manager is not supported in the 64-bit version of SSIS, as no OLE DB provider i
  4. Objective-c 类的继承 方法重写 方法重载
  5. js -- 移动端pc端自动切换
  6. Oracle 12C -- sequence的新特性-会话序列
  7. 转换实体类_利用Java反射机制进行Map和JavaBean间转换
  8. MySQL安装板多少钱_MySQL安装板怎么安装
  9. 修改telnet的用户名密码_远程管理设备telnet的N种设置方法
  10. MyBatis之输入(parameterType)与输出(resultType、resultMap)映射
  11. 开源大法好,Windows 计算器又添两项新功能
  12. 黑客勒索遭遇霸气回应:不怕,我们有备份
  13. Cron 表达式一篇通
  14. shell基础之后台运行脚本
  15. excel 绘制箱图
  16. POJ2109-Power of Cryptography
  17. SQL Server 2008 下载及版本说明
  18. linux virbr0是什么意思
  19. 十条网站盈利模式分析总结
  20. 2020阿里巴巴社招面试题

热门文章

  1. Boost:异步操作,需要boost :: asio :: async_compose函数的测试程序
  2. Boost:向上对齐align up integral的测试程序
  3. ITK:使用Otsu阈值图像
  4. ITK:仅将过滤器应用于图像的指定区域
  5. VTK:可视化算法之ClipSphereCylinder
  6. VTK:网格之ColoredElevationMap
  7. VTK:几何对象之Cell3DDemonstration
  8. OpenGL Compute Shader计算着色器的实例
  9. OpenGL 使用FDTD求解电磁波方程
  10. OpenGL 纹理Textures