今天工作的时候用到了一个反射。其业务简单描述为:系统启动时将需要定时调用的方法签名保存到数据库中,开启线程定时从数据库中读取对应的方法签名,通过反射生成实例后调用方法。完成一定的定时任务。

写到的方法签名如下

public Class A{

  public void  statistics( Member member, boolean flag )   // 这么写是错的。

}

调用  A.class().getMethod("statistics", Member.class, Boolean.class);   // 如此调用

报 NoSuchMethodException。

原因:   getMethod时方法签名必须要完全正确。此过程自动装箱拆箱无效。

解决方式: 把A中的statistics( Member member, boolean flag ) 改为:statistics( Member member, Boolean flag ).

顺便翻了一眼jdk文档:

其处理方式。

If the name is "<init>;"or "<clinit>" a NoSuchMethodException is raised.  <init> 和 <client>是什么东西。。。表示不知道

如果方法的参数为空,视为一个空数组。

其查找方法的算法如下:

说明:给定一个类C,

1. 如果指定的方法名称和参数名完全匹配,返回指定的方法,

2.如果给定C中没有找到对应的方法,则递归地进入到C的父类中查找,直到Object。另外,如果找到相同的签名的方法有多个,

If more than one such method is found in C, and one of these methods has a return type that is more specific than any of the others

即,如果超过超过1个方法匹配时,则判断这些方法的返回值,最后返回最精确匹配的方法。 // 一看到这,也是困惑,赶紧回去翻了下java基础语法,难道

一个类中可以定义多个相同签名的方法?(相同签名是指相同的方法名称,相同的参数类型,相同的参数类型的顺序)。如果匹配只精确到参数类型,那么随机返回一个

匹配上的方法。

// 最后给出了刚才我困惑的解释:java 语言不允许同一个类中拥有相同签名的方法超过1个,但是java 虚拟机是允许的。因为这个特性提高了虚拟机用于实现虚拟语言

的功能的灵活性。比如:Convarant 的返回值能够用 Bridge 方法实现, 这个Bridge 方法和方法冲写能够拥有相同的方法签名但是有不同的访问类型。。。。Bridge,不明觉厉。。。高大上的样子。

参考:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class...%29

java 反射的踩的一个坑的更多相关文章

  1. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  2. 【转】最近用Timer踩了一个坑,分享一下避免别人继续踩

    [转]最近用Timer踩了一个坑,分享一下避免别人继续踩 最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实 ...

  3. 记新人从 excel 文件中读取字典数据踩的一个坑

    原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...

  4. toFixed()一不小心踩了一个坑

    toFixed,多么简单的一个函数,昨天突发奇想做两道算法题练练手.结果,踩到了一个从未遇到的坑! \n 简单来讲是要对输入的很多组数据,自己写一个函数做个处理,把每次函数处理的结果要相加求和.最后输 ...

  5. Javascript之旅——第八站:说说instanceof踩了一个坑

    前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...

  6. 最近用Timer踩了一个坑,分享一下避免别人继续踩

    最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实非常好用,因为里面有非常人性化的start和stop功能, ...

  7. 使用SpringMVC<mvc:view-controller/>标签时踩的一个坑

    <mvc:view-controller>标签 如果我们有些请求只是想跳转页面,不需要来后台处理什么逻辑,我们无法在Action中写一个空方法来跳转,直接在中配置一个如下的视图跳转控制器即 ...

  8. Java 字符串Split方法的一个坑

    java字符串的split,只传一个参数,后面空白的字符串会被忽略: public static void main(String[] args) { String str = "ab|c| ...

  9. 使用SpringBoot的yml文件配置时踩的一个坑

    问题描述:使用SpringBoot整合redis进行yml配置的时候,启动工程报错,提示加载application.yml配置文件失败: ::27.430 [main] ERROR org.sprin ...

随机推荐

  1. Java Properties类

    Properties 是哈希表的一个子类.它是用来维持值列表,其中的键是一个字符串,值也是一个字符串. Properties类被许多其他的Java类使用.例如,它是对象通过System.getProp ...

  2. Java基础知识强化之IO流笔记74:NIO之 Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  3. 自己调用NTDLL函数

    一.概述 在DLL初始化的时候有时不能调用其它系统DLL的函数,以免导致问题,但有时候又必须要调用怎么办?一种办法就是自己直接调用NTDLL接口,这样肯定没有问题. 下面我写个自己调用Registry ...

  4. Uva 10596 - Morning Walk 欧拉回路基础水题 并查集实现

    题目给出图,要求判断不能一遍走完所有边,也就是无向图,题目分类是分欧拉回路,但其实只要判断度数就行了. 一开始以为只要判断度数就可以了,交了一发WA了.听别人说要先判断是否是联通图,于是用并查集并一起 ...

  5. Java Script基础(二) 基本语法

    一.变量的声明和使用 JavaScript是一种弱类型的语言,没有明确的数据类型,在声明变量时,不需要指定变量的类型,变量的类型由赋给变量的值决定. 变量声明的语法: var 变量名; 示例: var ...

  6. javascript中Math ceil(),floor(),round()三个函数的对比

    Math.ceil()执行的是向上舍入 Math.floor()执行向下舍入 Math.round()执行标准舍入 一下是一些补充: ceil():将小数部分一律向整数部分进位. 如: Math.ce ...

  7. Xcode6编译SDWebImage报错解决方法(SDWebImageDownloaderOperation.m错误)

    报错:Use of undeclared identifier '_executing' / '_finished': 解决方法: 在SDWebImageDownloaderOperation类的实现 ...

  8. js使用CSS将图片转换成黑白(灰色、置灰)

    详细内容请点击 可能早就知道,像汶川这种糟糕的日子网站全灰在IE下是可以轻松实现的(filter: gray;),不过,当时,其他浏览器是无解的. 不过,时代发展,如今,CSS3的逐步推进,我们也开始 ...

  9. 清除层div浮动

    clearboth { clear: both; display: block; height: 0; font-size: 0; overflow: hidden; } <div class= ...

  10. 七、Android学习笔记_JNI hello world

    1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin ...