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 ...
随机推荐
- spark HA
spark HA 的两种实现: 基于文件系统的单点恢复(Single-Node Recovery with Local File System) 基于zookeeper的Standby Masters ...
- 短小实用 渗透用的Python小脚本
渗透的很多时候,找到的工具并不适用,自己码代码才是王道,下面三个程序都是渗透时在网络上找不到合适工具,自己辛苦开发的,短小实用. 一.记录root密码小工具 root.py #!/usr/bin/py ...
- Comparison method violates its general contract
生产环境出现的错误排查,错误log如下 java.lang.IllegalArgumentException: Comparison method violates its general contr ...
- c++11 Chrono时间库
c++11 Chrono时间库 http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=chrono ...
- mina 粘包、多包和少包的解决方法
转载自:http://freemart.iteye.com/blog/836654 使用过 mina 的同学应该都遇到到过,在解码时少包.多包的问题,查阅了很多资料还是迷迷糊糊的,经过不懈努力,终于解 ...
- oracle优化辅助SQL语句
--查询正在执行的SQL语句 select a.program, b.spid, c.sql_text,c.SQL_FULLTEXT,c.SQL_ID from v$session a, v$proc ...
- 有一种风格,叫做 Low Poly 3D
原作:Simon阿文 杂交编辑者:RhinoC 个人更推崇使用第二款神器 ImageTriangulator :http://www.conceptfarm.ca/2013/port ...
- ankhSVN安装后,VS2010使用
Tool->option->Source control->plug-in selection,选择ankhSVN AnkhSvn-2.5.12478.zip
- 查看Nodejs 占用的端口
查看 Nodejs 占用的端口 ps -ef | grep node强制关闭端口 kill
- django 学习-17 Django会话Session
session 类似于字典的一个对象,是可读可写的 跟cookie的变化不大而且还显得简单 在这里我只说一下改变的地方 1.vim blog/views.py if uf.is_valid(): ...