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

 

转载于:https://www.cnblogs.com/xiaocc1288/p/4433641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值