• 使用Java反射优化多个方法调用


      有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇。前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有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()+"
    ");
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    得到结果

    至此通过Java反射执行方法就完成了,是不是相当灵活,对以后提供了便捷。

  • 相关阅读:
    QuickSort(Java)
    MergeSort(Java)
    Silverlight中Datagrid添加Button列用于控制单行对象
    二叉搜索树(BST)demo
    svn ignore使用方法
    海量数据处理面试题及解决方法
    Android中的单元测试
    Ubuntu下配置Intellij的Android开发环境
    urlrewrite地址重写之后丢失css和js解决方案
    修改后 简单的 TCP server
  • 原文地址:https://www.cnblogs.com/tangyin/p/9342159.html
Copyright © 2020-2023  润新知