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

时间: 2024-10-14 14:18:29

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

【Java记录】try-with-resources的一个坑

[Java记录]try-with-resources的一个坑 今天处理 AsynchronousFileChannel 时候的一个问题,代码如下: public static void main(String[] args) throws Exception { String filePath = "/home/xe/git/osc/JavaNote/Lang/data/Test.java"; ExecutorService executorService = Executors.ne

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

今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,很多时候一旦思维定势真的挺难突破的.下面是不正确的编码结果: 使用ffmpeg做视频编码过程中,首先要新建数据帧,并为数据帧分配相应内存,以便于保存图像数据,为数据帧分配内存需要用到av_image_alloc()这个函数,该函数将根据传入的图像宽.高.图像格式.数据对齐基数等参数进行内存分配. 这其中有一个参数可能会让人迷惑,那就是数据对齐基数这个参数该设置多少?顺便说说为什么要数据对齐,之所以要对齐,主要

利用java 反射机制来实现一个servlet处理多种请求

如果我们想在一个servlet中处理多种请求(比如新闻的添加.删除),简单的可以在jsp提交表单的action路径中添加一个键值对,然后再servlet中接收后根据不同的值来调用不同的方法. jsp端 1 <form action="newsServlet?method=add" method="post"> 2 <input type="text" ..> 3 <input type="submit&qu

Java中那些踩过的坑

仅以此随笔记录一些在java中踩过而且又重踩的坑 _(:з)∠)_ 1. Runnable In ScheduledExecutorsService 当使用ScheduledExecutorService, Runnable内没有捕获的RuntimeException将会使Executor停止运行,并且异常不会被输出. ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); schedu

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

最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实非常好用,因为里面有非常人性化的start和stop功能,在Timer里面还有一个Interval,就是用来设置时间间隔,然后时间间隔到了就会触 发Elapsed事件,我们只需要把callback函数注册到这个事件就可以了,如果Interval到了就会触发Elapsed,貌似一切看起来很顺其自然,但是 有一点一定要注意,callback函数本身执行也是需要

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

前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(SearchFlight)中,作为防御性编程,我需要在SearchFlight函数中进行参数检测,也就是判断过来的参数一 定是Array类型. 一:抛出问题 举个例子,下面有两个页面. Index.html页面 1 <!DOCTYPE html> 2 <html xmlns="http:

Java 字符串Split方法的一个坑

java字符串的split,只传一个参数,后面空白的字符串会被忽略: public static void main(String[] args) { String str = "ab|c||"; String [] split = str.split("\\|"); System.out.println(Arrays.toString(split)); } 输出结果是[ab, c]. 解决方法是split第二个参数传一个负数,例如 public static vo

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

问题描述:使用SpringBoot整合redis进行yml配置的时候,启动工程报错,提示加载application.yml配置文件失败: 17:18:27.430 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed java.lang.IllegalStateException: Failed to load property source from location 'clas

mongodb 的Cursor 作为 stream 的时候,读出来的数据数字开头的key没法访问(又踩了一个坑)

mongdb 用Cursor 读取数据的时候,直接用流读出来的数据key是数字开头的话,就是独具不到,用Object.keys() 把所有的key 打印出来的话如下:怎么会是这样的呢? 查看了一下文档,这个cursor返回的是一个object 模型,意味着他触发了真实的document 的实例,所以返回的是所有的documnet的实例(包含了其中的一些方法),所以可以用一些stream 的方法转化一下,真实的数据其实在_doc里面,所以可以用JSON.stringly()来转化一下.最简单的方法