`

通过制定方法名 和方法参数 从类中查找方法

    博客分类:
  • java
 
阅读更多

    protected Method findMatchingMethod() {
        String targetMethod = getTargetMethod();
        Object[] arguments = getArguments();
        int argCount = arguments.length;

        Method[] candidates = ReflectionUtils.getAllDeclaredMethods(getTargetClass());
        int minTypeDiffWeight = Integer.MAX_VALUE;
        Method matchingMethod = null;

        for (Method candidate : candidates) {
            if (candidate.getName().equals(targetMethod)) {
                Class[] paramTypes = candidate.getParameterTypes();
                if (paramTypes.length == argCount) {
                    int typeDiffWeight = getTypeDifferenceWeight(paramTypes, arguments);
                    if (typeDiffWeight < minTypeDiffWeight) {
                        minTypeDiffWeight = typeDiffWeight;
                        matchingMethod = candidate;
                    }
                }
            }
        }

        return matchingMethod;
    }

 

 

    public static int getTypeDifferenceWeight(Class[] paramTypes, Object[] args) {
        int result = 0;
        for (int i = 0; i < paramTypes.length; i++) {
            if (!ClassUtils.isAssignableValue(paramTypes[i], args[i])) {
                return Integer.MAX_VALUE;
            }
            if (args[i] != null) {
                Class paramType = paramTypes[i];
                Class superClass = args[i].getClass().getSuperclass();
                while (superClass != null) {
                    if (paramType.equals(superClass)) {
                        result = result + 2;
                        superClass = null;
                    }
                    else if (ClassUtils.isAssignable(paramType, superClass)) {
                        result = result + 2;
                        superClass = superClass.getSuperclass();
                    }
                    else {
                        superClass = null;
                    }
                }
                if (paramType.isInterface()) {
                    result = result + 1;
                }
            }
        }
        return result;
    }

分享到:
评论

相关推荐

    计算机二级公共基础知识

    例如,在一维数组[21,46,24,99,57,77,86]中,查找数据元素99,首先从第1个元素21开始进行比较,比较结果与要查找的数据不相等,接着与第2个元素46进行比较,以此类推,当进行到与第4个元素比较时,它们相等,...

    java常用工具类的使用

    该类的大部分构造器和方法都已经过时,但是该类使用非常方便,因此目前使用还很普遍,该类的另一个主要功能是,在数据库操作中,它允许将毫秒值表示为SQL DATE值,是数据库操作中java.sql.Date的父类。关于数据库...

    浅谈《计算机组装与维护》实训课程教学与实践应用.doc

    2 教学方法的探索 《计算机组装与维修》属于计算机信息类教育学科,主要锻炼和培养学生理论与实践巧妙 结合的能力,此科目的知识深化和提高,需要学生在熟悉了解理论知识的基础上,亲自 动手操作和实践,在实际运用...

    计算机应用基础讲解(共75张精选PPT).pptx

    上节知识回顾 Windows操作系统的运行环境及相关知识 Windows操作系统的基本操作方法及使用 Windows资源管理器窗口组成及文件夹和文件的管理 控制面板的使用 Windows附件系统工具的应用 计算机应用基础讲解(共75张...

    计算机应用基础word讲解.pptx

    使用帮助功能查找解决问题的方法。 计算机应用基础word讲解全文共76页,当前为第5页。 Word 概述 计算机应用基础word讲解全文共76页,当前为第6页。 Office 2003简介 MS-Office办公系列软件是美国微软公司开发的,...

    orcale常用命令

    先读取参数文件,再按参数文件中的设置启动数据库 例:startup pfile=E:Oracleadminoradbpfileinit.ora 8、startup EXCLUSIVE 二、用户如何有效地利用数据字典 ORACLE的数据字典是数据库的重要组成部分之一,它...

    SQL查询安全性及性能优化

    利用索引的查找功能从非聚集索引中检索行 扫描和查找 聚集索引有扫描和查找 非聚集索引也有扫描和查找 它们的区别: 扫描:可以理解为对数据进行顺序访问,并未使用索引进行查找 查找:可以理解为用索引进行...

    软件工程知识点

    需要通过数据实体、数据关系和数据属性这三类图形元素建立数据关系模型。 (4)系统状态模型。通过系统的外部事件、内部状态为基本元素来描绘系统的工作流程,这种建模方式比较适合于描述一些依赖于外部事件驱动的...

    临汾区块煤层气井提产阶段排采控制研究

    为查找出影响临汾区块煤层气高产稳产井和峰后下降井稳产效果差异的原因,分别对高产稳产井和峰后下降井提产阶段的井底压力下降速度、日产气增速等排采控制指标进行了对比分析,首次揭示出了产气速度对煤储层压降扩展...

    图书借阅系统----数据库课程设计报告.doc

    一.制作背景 随着图书馆规模的不断扩大,图书数量也相应的增加,有关图书的各种信息量也成倍 增加,面对着庞大的信息量,传统的人工方式管理会导致图书馆管理上的混乱...通过输入参数值(借阅号),来查找某一借阅者的

    Linux 内核中listen系统调用

    它接受两个参数:`fd` 和 backlog。`fd` 是文件描述符,代表一个打开的 socket;`backlog` 是一个整数,它制定了 socket 可以排队的最大连接数。 函数定义中的变量: - struct socket *sock;: 定义了一个 socket ...

    matlab匹配滤波代码-CardDetector:在Python中使用ComputerVision的卡检测器

    matlab匹配滤波代码使用计算机视觉的卡...通过应用查找轮廓函数(使用RETR_EXTERNAL参数)来检测卡,并通过roxPolyDP获取拐角点(请参见functions.describe_cards)。 2.模板 用于TemplateMatch功能的模板是从Templat

    软件测试规范

    1.等价类划分 .......................................................................................................................................... 7 2.因果图 ........................................

    RED HAT LINUX 6大全

    本书内容翔实、涉及领域广泛,并且提供了详细的例子和大量的参考资料(包括书籍、电子文档和Internet站点),是一本学习、使用和管理Linux不可多得的好书。 目 录 译者序 前言 第一部分 Red Hat Linux的介绍与安装 ...

    MAPGIS地质制图工具

    3、选择菜单剖面图-读取地形数据(现有3种方式,此选拉线读取),沿着勘探线从开始处拉线到末端出现设置基本数据对话框(如下图),这里要注意地形图比例尺和剖面图比例尺,默认是1:5000和1:2000。如果不是这个...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    4、分表操作的支持:对于分表操作和常规的使用没有区别,只是指定分表规则,mybatis好像也可以通过制定参数实现分表处理,没搞清楚hibernate对这个是怎么处理的(hibernate好像是bean和表一对一绑定的)? ...

    宿舍管理系统总体设计.pdf

    对于调试过程中高中资料试卷技术问题,作为调试人员,需要在事前掌握图纸资料、设备制造厂家出具高中资料试卷试验报告与相关技术资料,并且了解现场设备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,...

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版

    9.1.48 show stats——从 SPD 中显示IPsec和IKE统计信息 414 9.2 ipxroute——IPX路由 414 9.3 lodctr——性能计数 415 9.4 logman——管理日志 417 9.5 secedit——安全配置 422 9.5.1 secedit /analyze 422 9.5.2 ...

    模拟的考勤系统

    界面简洁,美观,分两个大模块(左、右)。 左边 是导航菜单。一个js做的时间表 右边 是根据左边的菜单导航的各个对应位置的功能设置 ...基本设置 部门设置 查看、添加、删除、修改...数据库在DB_51aspx文件夹中 附加即可

    oracle实验报告

    1、 写存储过程,显示所指定雇员名所在的部门名和位置。 CREATE OR REPLACE PROCEDURE DeptMesg(pename emp.ename%TYPE, pdname OUT dept.dname%TYPE,ploc OUT dept.loc%TYPE) AS BEGIN SELECT dname,loc INTO pd...

Global site tag (gtag.js) - Google Analytics