不采用反射时,调用大概是这样子:
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参数来。请问,这种回调方式是不是用不了反射机制啊?
解决方案 »
- 求助一个初级题,在线等(急),马上结。
- 关于类加载器的保护域的问题
- 欢迎石家庄的java朋友加入改群 33600835 互相学习。。。
- 从小到大排列出10个数字 快救我,马上要交,新手请教
- utf-8如何与unicode相互转换,求示例代码?
- 请专家指导
- 谁用过JBuildX+WinCvs?
- java 类型记录
- 如何将JAVA程序编译为EXE并建立为系统服务?
- 请问Jcreator2.5中deprecated API是什么意思?
- 堆中对象实例都放了什么东西?
- 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提供给你了,为什么不直接导入使用,非要复杂化