跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个 Java 反射与动态代理的问题:动态代理生成的对象通过反射设置报错
未分類
8 10 月 2020

请教一个 Java 反射与动态代理的问题:动态代理生成的对象通过反射设置报错

请教一个 Java 反射与动态代理的问题:动态代理生成的对象通过反射设置报错

資深大佬 : cqdx02 3

比如定义了一个接口 IHello:

interface IHello {   void printHello(); } 

以及一个 User 类:

class User {    IHello ihello;    public User(){}    public void setIHello(IHello hello){      this.ihello = hello;   }    public void sayHello(){      iHello.printHello();   }  } 

在实际调用时,采用动态代理先生产 IHello 的实例,然后设置到 User 对象中调用是可以的:

Ihello hello = (IHello) new DynamicProxy().bind(new Hello());  User user = new User();  user.setIHello(hello);  user.sayHello(); 

现在某些情况下,我要通过反射的方式设置 User 中的成员变量,我是这么写的:

Ihello hello = (IHello) new DynamicProxy().bind(new Hello());  User user = new User();  Class<?> parmeter = new Class[1];  parmeter[0] = hello.getClass();  // 获取方法时出错  Method setHello = user.getClass().getDeclaredMethod("setIHello", parmeter);  setHello.invoke(user,hello); 

在上面一句获取方法时出错了,报错内容为 NoSuchMethodException,因为 parmeter 类型不对。

请教应该怎么改呢?

(上面那句改成 getDeclaredMethod(“setIHello”, IHello.class)肯定是可以的,问题是现在不希望指定类型,而希望 parmeter 是动态生成的)

大佬有話說 (7)

  • 資深大佬 : JasonLaw

    hello.getClass() != IHello.class

  • 主 資深大佬 : cqdx02

    @JasonLaw 嗯嗯,那应该如何改呢?

  • 資深大佬 : JasonLaw

    @cqdx02 #2 我希望你提供完整的代码,你贴出的代码不仅仅有错误、不完整,也不知道 DynamicProxy 到底是哪里来的。

  • 主 資深大佬 : cqdx02

    @JasonLaw 好的,我只贴了报错的那部分,晚上回去补全下。

  • 資深大佬 : young1lin

    你这样写肯定是错的啊,会不会用反射? IDEA 没提示?

    parmeter[0] = hello.getClass();

    // 获取方法时出错

    Method setHello = user.getClass().getDeclaredMethod(“setIHello”, parmeter);
    首先,你这获取的是具体的实体类,但是这里是要求你根据方法名和方法参数类型,来获得具体的方法对象句柄。你也可以理解为获得方法的定义,方法的外壳。

    后面的 method.invoke 是传具体参数,如果你这里传的是 hello.getClass() 这里获取的是具体的类,比如 Hello.class,而不是 IHello.class 。

    你可以打个断点看看到底是怎么回事,他就会去找 setIHello(Hello hello),而不是 setIHello(IHello iHello)方法,当然会报没有这样的方法的错误。你把这个

    Method setHello = user.getClass().getDeclaredMethod(“setIHello”, parmeter);

    parrmeter 改成 IHello.class 不就好了?

    我建议你好好在 《 Java 编程思想》里面好好看看关于反射的那一章。

  • 資深大佬 : palmers

    // 获取方法时出错

    Method setHello = user.getClass().getDeclaredMethod(“setIHello”, parmeter);

  • 資深大佬 : palmers

    @palmers 这句使用泛型约束是可以的

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具