请教一个 Java 反射与动态代理的问题:动态代理生成的对象通过反射设置报错
比如定义了一个接口 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 是动态生成的)