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类放入固定的包名下面,只有根据数据库的表明以及对应包的路径名称来获取到全类名,之后获取到对应的字节码文件之后

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

反射用处着实很大。

java反射,代码优化的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

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

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. c# 计算星座

    public string xz(DateTime birthday) { float birthdayF = 0.00F; if (birthday.Month == 1 && bi ...

  2. 洛谷P1124 文件压缩

    https://www.luogu.org/problem/show?pid=1124 题目背景 提高文件的压缩率一直是人们追求的目标.近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本 ...

  3. 状压dp Gym - 100676G

    http://codeforces.com/gym/100676 题目大意: 给你n个科目,m个关系,例如A->B,表示要学习B科目,一定要把A科目学习掉.同理,如果还有C->B,那么,B ...

  4. 【BZOJ】1597 [Usaco2008 Mar]土地购买

    [算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs. ...

  5. python初步学习-生成式、生成器、迭代器、装饰器

    生成式 列表生成式 字典生成式 集合生成式 嵌套列表生成式 列表生成式 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.语法格式为 ...

  6. js_网页导出pdf文件

    打印当前页面,一开始我认为是需要输出pdf的,后来了解的需求是能够打印就可以了.需求既然都研究了,记录下. 更好的打印方式,window.print();会弹出打印对话框,打印的是window.doc ...

  7. localStorage H5本地存储

    域内安全.永久保存.即客户端或浏览器中来自同一域名的所有页面都可访问localStorage数据且数据除了删除否则永久保存,但客户端或浏览器之间的数据相互独立. <!doctype html&g ...

  8. python基础之常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  9. i8042 键盘控制器-------详细介绍

    [转]http://shanzy.bokee.com/834368.html ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片.一个是 intel 8042 芯片,位于主板上, ...

  10. linux动态库编译和使用详细剖析 - 后续

    引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...