相关文章推荐
曾深爱过的烤红薯  ·  Jackson的核心类与API方法:Obje ...·  2 月前    · 
眉毛粗的毛衣  ·  Xml文件通用解析与序列化_c++ ...·  1 月前    · 
老实的烈酒  ·  使用Node.js ...·  1 月前    · 
发财的李子  ·  TestRestTemplate ...·  1 月前    · 
安静的包子  ·  JavaScript中onclick事件传递 ...·  1 月前    · 
打盹的斑马  ·  【小新平板新品上市全...·  8 月前    · 
奋斗的皮蛋  ·  可爱狗狗五郎和荒泷一斗_哔哩哔哩_bilibili·  1 年前    · 
喝醉的电脑桌  ·  十年汶川,从天崩地陷到涅槃重生。·  1 年前    · 
英姿勃勃的鸡蛋面  ·  ue4的项目工程文件 - CSDN文库·  1 年前    · 
淡定的打火机  ·  【CV-instance ...·  2 年前    · 
Code  ›  java 8里 Method方法bug -
bean object
https://segmentfault.com/q/1010000007137693
想表白的沙滩裤
2 年前
segmentfault segmentfault
注册登录
问答 博客 标签 活动
发现
✓ 使用“Bing”搜本站 使用“Google”搜本站 使用“百度”搜本站 站内搜索
注册登录
  1. 首页
  2. 问答
  3. java
  4. 问答详情

java 8里 Method方法bug

头像
robinyang
8 2 6
发布于
2016-10-12
更新于
2016-10-12

在写rpc框架的时候出现了头疼问题:

public Object invoke(Object bean)throws Exception {
        Method[] methods = clazz.getMethods();
        for (Method method:methods) {
            if(method.getName().equals(method.getName())){
                return method.invoke(bean, param);
        throw new Exception("找不到方法");

这样写能找到方法,没有问题!!但是换成下面的方式就出问题了。

public Object invoke(Object bean)throws Exception {
        return clazz.getMethod(method, param.getClass()).invoke(bean, param);

跑出异常为:
java.lang.NoSuchMethodException:com.robin.interf.UserService.getUser(java.lang.Integer)

java使用的版本是:jdk1.8.0_101

Class.java代码跟踪:
图片描述

是一个searchMethods的方法在查找,继续走
图片描述

代码走到这里,res=null,导致NoSuchMethodException异常,算是java8 bug吧!

原因:searchMethods方法里,m.getName() == internedName这句导致的,正确的是m.getName().intern() == internedName,因为m.getName()是堆里取出值,而internedName是常量池里的,而m.getName().intern()会将常量池里存在的字符串直接取到,不存在的会放入到常量池里。

建议:建议使用class.getMethods(),然后我们自己遍历,不推荐使用class.getMethod(methodName, paras)

java
阅读 3.8k
3 个回答
得票 最新
头像
行走在赤道
5k 4 36 52
发布于
2016-10-12
更新于
2016-10-12
✓ 已被采纳

你的逻辑只匹配了 方法名称 并没有匹配 参数类型 吧。

public Object invoke(Object bean)throws Exception {
    Method[] methods = clazz.getMethods();
    for (Method method:methods) {
        if(method.getName().equals(method.getName())){
            return method.invoke(bean, param);
    throw new Exception("找不到方法");

上面的代码是楼主查询的method的方式吧,我说未匹配类型,是指楼主自己写的代码中没有匹配参数的类型。而jdk内部是有这个判断的。

public class Test {
    public String hello(int i) {
        return "Hello" + i;
    public static void main(String[] args) {
        Test t = new Test();
        try {
            Method m = Test.class.getMethod("hello", Integer.class);
            System.out.println(m.invoke(t, 9));
        } catch (Exception e) {
            e.printStackTrace();
        try {
            Method m = Test.class.getMethod("hello", int.class);
            System.out.println(m.invoke(t, 8));
        } catch (Exception e) {
            e.printStackTrace();

我不太清楚楼主的代码是如何编写的,不过这段代码楼主可以运行一下看看区别。

头像
snsyzf
34 6
发布于
2016-10-12
public static void main(String[] args) throws InvocationTargetException {
    try {
        Class<?> c = Class.forName("java.lang.StringBuilder");
        Object instance = c.newInstance();
        Method m = c.getMethod("append", String.class);
        Object o = m.invoke(instance, "Hello World");
        System.out.println(o);
 
推荐文章
曾深爱过的烤红薯  ·  Jackson的核心类与API方法:ObjectMapper、JsonNode、ObjectNode、ArrayNode_jackson api
2 月前
眉毛粗的毛衣  ·  Xml文件通用解析与序列化_c++ xml文件序列化
1 月前
老实的烈酒  ·  使用Node.js SDK删除单个与批量对象-对象存储-阿里云
1 月前
发财的李子  ·  TestRestTemplate (Spring Boot 4.0.6 API)
1 月前
安静的包子  ·  JavaScript中onclick事件传递数组参数时接收的是[object,object],需要转为字符串传递_onclick传数组
1 月前
打盹的斑马  ·  【小新平板新品上市全...
8 月前
奋斗的皮蛋  ·  可爱狗狗五郎和荒泷一斗_哔哩哔哩_bilibili
1 年前
喝醉的电脑桌  ·  十年汶川,从天崩地陷到涅槃重生。
1 年前
英姿勃勃的鸡蛋面  ·  ue4的项目工程文件 - CSDN文库
1 年前
淡定的打火机  ·  【CV-instance segmentation】Mask R-CNN阅读笔记 - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号