谈谈java反射的应用

来源:互联网 发布:ubuntu设置超级用户 编辑:程序博客网 时间:2024/06/05 18:38

谈谈java反射的应用

      开发项目期间,遇到这样的一种场景:“统计分析文化节目,文化活动,课程的发布量”,当时自己是这样的做,先做文化节目的统计分析,完了之后,再写文化活动与课程的统计分析,完成之后发现,发现其中三个主要的分析方法惊人的相似,主要是相似指的是“代码层次上的相似”。这几次看到设计模式的书籍,惊人想起那几段代码,感觉有文章可做!

      于是就将反射应用到了其中!下面就是跟项目类似的场景代码!

首先先看看最初的代码:

首先分析的实体类Lesson.java:

package com.steadyjack.reflectTwo;import java.util.Date;/** * @author 钟林森 */public class Lesson{public String name;public Date createTime;public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Lesson() {}public Lesson(String name) {super();this.name = name;}}
实体类Program.java:

package com.steadyjack.reflectTwo;import java.util.Date;/** * @author 钟林森 */public class Program{public String name;public Date uploadTime;public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getUploadTime() {return uploadTime;}public void setUploadTime(Date uploadTime) {this.uploadTime = uploadTime;}public Program(String name) {super();this.name = name;}public Program() {super();}}
然后,下面就是分析节目与课程的代码,直接上代码吧!理解起来也简单:

package com.steadyjack.reflectTwo;import java.util.ArrayList;import java.util.List;/** * @author 钟林森 */public class AnaylyseLessonAndProgramClass {private static List<Program> listProgram=new ArrayList<>();private static List<Lesson> listLesson=new ArrayList<>();static{Program program1=new Program("aa");Program program2=new Program("ab");Program program3=new Program("bb");Program program4=new Program("bc");Program program5=new Program("ac");listProgram.add(program1);listProgram.add(program2);listProgram.add(program3);listProgram.add(program4);listProgram.add(program5);Lesson lesson1=new Lesson("aa");Lesson lesson2=new Lesson("ab");Lesson lesson3=new Lesson("bb");Lesson lesson4=new Lesson("bc");Lesson lesson5=new Lesson("ac");listLesson.add(lesson1);listLesson.add(lesson2);listLesson.add(lesson3);listLesson.add(lesson4);listLesson.add(lesson5);}public static void main(String[] args) {int total1=analyseProgramList();System.out.println(total1);int total2=analyseLessonList();System.out.println(total2);}//分析节目:查看节目名称含有 指定字符 的节目public static int analyseProgramList(){int total=0;Program program=null;for(int i=0;i<listProgram.size();i++){program=listProgram.get(i);if (program.getName().contains("c")) {total += 1;}}return total;}//分析课程:同理public static int analyseLessonList(){int total=0;Lesson lesson=null;for(int i=0;i<listLesson.size();i++){lesson=listLesson.get(i);if (lesson.getName().contains("c")) {total += 1;}}return total;}}

代码你会发现,惊人的相似,于是乎,我采用反射进行了重构:

package com.steadyjack.reflectTwo;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;/** * @author 钟林森 * 反射的应用:超棒 */public class AnalyseLessonAndProgramClassReflect {private static List<Program> listProgram=new ArrayList<>();private static List<Lesson> listLesson=new ArrayList<>();static{Program program1=new Program("aa");Program program2=new Program("ab");Program program3=new Program("bb");Program program4=new Program("bc");Program program5=new Program("ac");listProgram.add(program1);listProgram.add(program2);listProgram.add(program3);listProgram.add(program4);listProgram.add(program5);Lesson lesson1=new Lesson("aa");Lesson lesson2=new Lesson("ab");Lesson lesson3=new Lesson("bb");Lesson lesson4=new Lesson("bc");Lesson lesson5=new Lesson("ac");listLesson.add(lesson1);listLesson.add(lesson2);listLesson.add(lesson3);listLesson.add(lesson4);listLesson.add(lesson5);}public static void main(String[] args) {int toal1=analyseList2(listLesson, "getName", "c");System.out.println(toal1);}/** * 分析:具有通用性! * @author zhonglinsen * @param objParam:接收统一的参数-如listProgram,listLesson * @param methodParam:需要调用的对象的方法名 * @param likeCharacterParam:需要模糊查询的指定字符 * @return */@SuppressWarnings("unchecked")public static int analyseList2(Object objParam,String methodParam,String likeCharacterParam){int total=0;List<Object> objList=new ArrayList<>();if (objParam instanceof List) {objList=(List<Object>) objParam;}if (objList!=null && objList.size()>0) {try {for(Object tempObj:objList){Method method=tempObj.getClass().getMethod(methodParam);String result=(String) method.invoke(tempObj);if (result.contains(likeCharacterParam)) {total += 1;}}} catch (Exception e) {System.out.println(e.getMessage());}}return total;}}

好了,就介绍到这里吧!觉得那句“反射反射,程序员的快乐!”真的很有道理!对代码的重构真是起到了很大的作用!想与我交流的可以在下面留言,或者加群:java修炼塔 535296702,我叫debug,欢迎交流!



0 0
原创粉丝点击