使用Java反射优化多个方法调用
2018-07-22 05:48:13来源:博客园 阅读 ()
有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇。前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有N个指标,一个指标就对应一个方法,所以系统代码中就是这样一个情况:一个产品下面会写很多调用的方法,这些方法其他产品也可以调用的,抽象出来的。然后我就想到了Java反射,通过反射机制java执行方法,通过数据库配置达到灵活调用,不管以后增加产品还是增删指标方法,都可以不用修改Java代码直接数据库配置就行了,话不多说,上干货。
ClassData.java 用于配置
1 public class ClassData { 2 3 //java类名称 4 private String packages; 5 6 //方法名 7 private String className; 8 //方法需要的参数类型名 9 private String parameter1; 10 //方法需要的参数类型名 11 private String parameter2; 12 //这个方法得出的值用什么名字接收 比如 User类的name属性 这个值就是name 13 private String names; 14 15 16 17 public String getNames() { 18 return names; 19 } 20 21 public void setNames(String names) { 22 this.names = names; 23 } 24 25 public String getPackages() { 26 return packages; 27 } 28 29 public void setPackages(String packages) { 30 this.packages = packages; 31 } 32 33 public String getClassName() { 34 return className; 35 } 36 37 public void setClassName(String className) { 38 this.className = className; 39 } 40 41 public String getParameter1() { 42 return parameter1; 43 } 44 45 public void setParameter1(String parameter1) { 46 this.parameter1 = parameter1; 47 } 48 49 public String getParameter2() { 50 return parameter2; 51 } 52 53 public void setParameter2(String parameter2) { 54 this.parameter2 = parameter2; 55 }
模拟数据 这里我是直接写的为了方便 最好是建表配置在数据库 从数据库得到相应的集合list
public static List<ClassData> getlist(){ List<ClassData> list = new ArrayList<ClassData>(); ClassData c = new ClassData();
c.setPackages("com.cq.test.clas.ClassVo");
c.setClassName("getNameVal");
c.setParameter1("java.lang.String");
c.setNames("name");
ClassData c1 = new ClassData();
c1.setPackages("com.cq.test.clas.ClassVo");
c1.setClassName("getAgeVal");
c1.setParameter1("java.lang.String");
c1.setParameter2("java.lang.String");
c1.setNames("age");
ClassData c2 = new ClassData();
c2.setPackages("com.cq.test.clas.ClassVo");
c2.setClassName("getDateVal");
c2.setParameter1("java.lang.String");
c2.setNames("date");
ClassData c3 = new ClassData();
c3.setPackages("com.cq.test.clas.ClassVo");
c3.setClassName("getMyVal");
c3.setParameter1("java.lang.String");
c3.setNames("my");
list.add(c);
list.add(c1); list.add(c2); list.add(c3); return list; }
user.java
package com.cq.test.vo; import java.math.BigDecimal; import java.util.Date; public class User { private String name; private Integer age; private Date date; private BigDecimal my; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public BigDecimal getMy() { return my; } public void setMy(BigDecimal my) { this.my = my; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", date=" + date + ", my=" + my + "]"; } }
ClassVo.java 这是上面配置的java类
package com.cq.test.clas; import java.math.BigDecimal; import java.util.Date; public class ClassVo { public String getNameVal(String name){ System.out.println("名字:"+ name); return "名字"+name; } public Integer getAgeVal(String age){ System.out.println("年龄:"+ (age)); return 18; } public Date getDateVal(String date){ System.out.println("时间:"+ date); return new Date(); } public BigDecimal getMyVal(String bigg){ BigDecimal big = new BigDecimal(100); System.out.println("钱:"+ big); return big; } }
给实体类属性赋值的方法
public static <T> T modelTrim(T model,String names,Object invoke){ Class<T> clazz = (Class<T>) model.getClass(); //获取所有的bean中所有的成员变量 Field[] fields = clazz.getDeclaredFields(); for(int j=0;j<fields.length;j++){ if(fields[j].getName().equals(names)){ //获取所有的bean中变量类型为String的变量 //if("Integer".equals(fields[j].getType().getSimpleName())){ try { if(invoke != null && !"".equals(invoke)){ //获取set方法名 String setMethodName = "set"+fields[j].getName().substring(0, 1).toUpperCase() +fields[j].getName().replaceFirst("\\w", ""); //得到get方法的Method对象,带参数 Method setMethod = clazz.getDeclaredMethod(setMethodName,fields[j].getType()); setMethod.setAccessible(true); //赋值 setMethod.invoke(model, (Object)(invoke)); } } catch (Exception e) { e.printStackTrace(); } //} } } System.out.println("model--"+model.toString()); return model; }
执行main方法
public class MethodTest { public static void main(String[] args){ List<ClassData> getlist = getlist(); int i = 1; User user = new User(); System.out.println(user.getName()); for(ClassData cd:getlist){ try { Class<?> userClass = Class.forName(cd.getPackages()); Object object = userClass.newInstance(); Method refTest1 = userClass.getDeclaredMethod(cd.getClassName(),Class.forName(cd.getParameter1())); Object invoke = refTest1.invoke(object, "1"); i++; System.out.println("执行前"+user.toString()+"invoke:"+invoke); modelTrim(user,cd.getNames(),invoke); System.out.println("执行后"+user.toString()+"\n"); } catch (Exception e) { e.printStackTrace(); } } } }
得到结果
至此通过Java反射执行方法就完成了,是不是相当灵活,对以后提供了便捷。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash