不采用反射时,调用大概是这样子:
IRecvResponse recver = new RecvResponseImp();
Stub.instanceService(recver);
其中,IRecvResponse接口类和Stub类是别人提供的,我要产生一个实现IRecvResponse接口类的对象,然后将这个对象注册到Stub中,当Stub中有消息到来的时候,Stub会回调我注册进去的对象,这样我就能在RecvResponseImp中处理消息了。如果是采用反射调用,虽然我能将IRecvResponse接口反射出来,但是不知道怎么用它产生RecvResponseImp对象,也就是说,没法用反射方式调用instanceService函数,因为我构造不出recver参数来。请问,这种回调方式是不是用不了反射机制啊?
IRecvResponse recver = new RecvResponseImp();
Stub.instanceService(recver);
其中,IRecvResponse接口类和Stub类是别人提供的,我要产生一个实现IRecvResponse接口类的对象,然后将这个对象注册到Stub中,当Stub中有消息到来的时候,Stub会回调我注册进去的对象,这样我就能在RecvResponseImp中处理消息了。如果是采用反射调用,虽然我能将IRecvResponse接口反射出来,但是不知道怎么用它产生RecvResponseImp对象,也就是说,没法用反射方式调用instanceService函数,因为我构造不出recver参数来。请问,这种回调方式是不是用不了反射机制啊?
解决方案 »
- 返回值问题
- 有没有办法把几百个上千个字母组成的数列,把相似的末端和首端连接起来组成长数列
- 一则随机数取值范围的疑惑
- 求解!!————-用prepareStatement对ACCESS进行模糊查找。问题!!!
- 【求助】数据库文件导出相关问题两例
- 请教:怎么理解线程通信的概念?
- j2sdk1.4.1_01 中怎样把java的中间代码反编译?
- Oracle培训到哪里好
- Java有关JScrollPane和JTable的使用时横滚动条的问题请教
- awt中textField如何得到输入焦点?
- 堆中对象实例都放了什么东西?
- java -jar执行jar包出现 java.io.IOException: invalid header field name无法解决
IRecvResponse recver = (IRecvResponse) Class.forName("cn.com.RecvResponseImp").newInstance();//填写RecvResponseImp类正确的包名
} catch (Exception e) {
e.printStackTrace();
}
public void instanceService(Object callbackHandler, String methodName) {调用时则:
Method m = callbackHandler.getClass().getDeclaredMethod(methodName);
m.invoke(callbackHandler);另一种方式则是直接传递回调的类名和函数名,但比较少用,因为这样做的话,回调主体不明确:
public void instanceService(String callbackClass, String methodName) {
如1L所说的,通过反射生成接口的实现类RecvResponseImp的实例(前提是别人也把实现类RecvResponseImp提供给你)
public class RecvResponseImp implements IRecvResponse {
/**
* 响应消息
* String : JSON格式的消息
* byte[] : 二进制消息内容 (可能有可能无,和具体消息有关)
*/
public void responseAction(String message, byte[] accessory) {
// 我对业务消息进行具体处理 }
}
采用反射方式时,因为编译时我并没有IRecvResponse,故我无法产生RecvResponseImp类,进而没法通过反射调用instanceService方法。
别人已经把instanceService方法写好了,他没有按你说的那样写,而是提供了一个IRecvResponse接口让我实现,然后他通过IRecvResponse接口进行回调。
Method m = callbackHandler.getClass().getDeclaredMethod(methodName);
m.invoke(callbackHandler);
相当于约定了一个方法名,而他提供IRecvResponse的方式相当于约定了一个接口类。
2L的方式更加灵活,更像C语言回调的方式,即注册一个函数指针。
如果不方便给,那有IRecvResponse 的接口说明也可以,在你本地写一个接口,一个实现类。
接口说明也没有,那就要对方提供一个通用接口。
包当然有了,只是我不想使用直接调用的方式。我自己定义一个IRecvResponse接口,虽然和别人的一摸一样,但是调用instanceService时,抛出异常,说参数不合法。
为什么我想用反射呢,是因为我不想把别人的若干个jar包加入我的eclipse插件工程中。
IRecvResponse recver = (IRecvResponse) Class.forName("cn.com.RecvResponseImp").newInstance();//填写RecvResponseImp类正确的包名
} catch (Exception e) {
e.printStackTrace();
}这样就OK了
如果是这样,可以采用动态编译,即以参考 com.sun.tools.javac包不过既然人家都把jar提供给你了,为什么不直接导入使用,非要复杂化