java 反射的踩的一个坑
今天工作的时候用到了一个反射。其业务简单描述为:系统启动时将需要定时调用的方法签名保存到数据库中,开启线程定时从数据库中读取对应的方法签名,通过反射生成实例后调用方法。完成一定的定时任务。
写到的方法签名如下
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 反射的踩的一个坑的更多相关文章
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- 【转】最近用Timer踩了一个坑,分享一下避免别人继续踩
[转]最近用Timer踩了一个坑,分享一下避免别人继续踩 最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实 ...
- 记新人从 excel 文件中读取字典数据踩的一个坑
原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...
- toFixed()一不小心踩了一个坑
toFixed,多么简单的一个函数,昨天突发奇想做两道算法题练练手.结果,踩到了一个从未遇到的坑! \n 简单来讲是要对输入的很多组数据,自己写一个函数做个处理,把每次函数处理的结果要相加求和.最后输 ...
- Javascript之旅——第八站:说说instanceof踩了一个坑
前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(Sea ...
- 最近用Timer踩了一个坑,分享一下避免别人继续踩
最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实非常好用,因为里面有非常人性化的start和stop功能, ...
- 使用SpringMVC<mvc:view-controller/>标签时踩的一个坑
<mvc:view-controller>标签 如果我们有些请求只是想跳转页面,不需要来后台处理什么逻辑,我们无法在Action中写一个空方法来跳转,直接在中配置一个如下的视图跳转控制器即 ...
- Java 字符串Split方法的一个坑
java字符串的split,只传一个参数,后面空白的字符串会被忽略: public static void main(String[] args) { String str = "ab|c| ...
- 使用SpringBoot的yml文件配置时踩的一个坑
问题描述:使用SpringBoot整合redis进行yml配置的时候,启动工程报错,提示加载application.yml配置文件失败: ::27.430 [main] ERROR org.sprin ...
随机推荐
- what is docker
尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来. 官网的介绍是这样的: Docker is an open platfo ...
- cigarettes
描述 Tom has many cigarettes. We hypothesized that he has n cigarettes and smokes them one by one keep ...
- Java基础知识强化105:打印数组的方法总结
1. 使用for循环打印数组. 2. 使用Arrays工具类,将数组转化为有序的List打印出来. 3. 使用Arrays工具类,使用Arrays.toString()输出数组内容. 上面三种方法打印 ...
- 测试 IE 浏览器兼容性 VirtualBox + modern.ie
VirtualBox 是开源的虚拟机软件,常用的虚拟机软件还有 VMware / Hyper-V / Paralles Desktop . modern.ie 是微软官方提供的用于测试网页在各版本 I ...
- 【Shell脚本学习2】Shell脚本语言与编译型语言的差异
大体上,可以将程序设计语言可以分为两类:编译型语言和解释型语言. 编译型语言 很多传统的程序设计语言,例如Fortran.Ada.Pascal.C.C++和Java,都是编译型语言.这类语言需要预先将 ...
- 重构19-Extract Factory Class(提取工厂类)
在代码中,通常需要一些复杂的对象创建工作,以使这些对象达到一种可以使用的状态.通常情况下,这种创建不过是新建对象实例,并以我们需要的方式进行工作.但是,有时候这种创建对象的需求会极具增长,并且混淆了创 ...
- Kali linux 2016无法打开virtualbox问题解决
Kali Linux在安装完virtualbox后,打开虚拟机会出现:kernel driver not installed (rc=1908)错误提示,根据提示,大概可以看出是由于缺少内核模块引起的 ...
- ankhSVN安装后,VS2010使用
Tool->option->Source control->plug-in selection,选择ankhSVN AnkhSvn-2.5.12478.zip
- winform分页管理
注意:其中可能用到部分自定义的扩展方法,在使用中需自己修改一下 /// <summary> /// 分页管理 /// </summary> public class Pagin ...
- Jquery事件委托之Safari
什么是事件委托 事件委托是Jquery中一种事件绑定的方式,不同于常见的事件绑定方式将事件绑定在目标元素上,而是将事件绑定在父级元素上通过事件冒泡来执行绑定函数. //常见的事件绑定(Jquery) ...