sinat_36027429 2018-09-20 04:41 采纳率: 100%
浏览 615
已采纳

在看书《Java核心技术I》,在代理那章有一个关于InvocationHandler的问题没看懂,望大神能解释一下。

书上内容:
6.5.2 创建代理对象 要想创建一个代理对象,需要使用 Proxy类的 newProxylnstance方法。这个方法有三个
参数:
•一个类加栽器(class loader)。作为 Java 安全模型的一部分,对于系统类和从因特网 上下载下来的类,可以使用不同的类加载器。有关类加载器的详细内容将在卷 章中讨论。目前,用 null 表示使用默认的类加载器。 •一个 Class对象数组,每个元素都是需要实现的接口。
n 第 9
•一个调用处理器。 还有两个需要解决的问题。如何定义一个处理器? 能够用结果代理对象做些什么? 当
然,这两个问题的答案取决于打算使用代理机制解决什么问题。使用代理可能出于很多原 因,例如:
•路由对远程服务器的方法调用。 •在程序运行期间,将用户接口事件与动作关联起来。 •为调试,跟踪方法调用。 在示例程序中,使用代理和调用处理器跟踪方法调用,并且定义了一个 TraceHander 包 装器类存储包装的对象。其中_的 invoke方法打印出被调用方法的名字和参数,随_后用包装好的对象作为隐式参数调用这个方法。
class TraceHandler implements InvocationHandler
{
private Object target ;
public TraceHandler(Object t)
{
target = t;
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable
{
// print method name and parameters
// invoke actual method
return m.invoke(target , args) ;
}
}

问题:我不理解为什么invoke()可以打印出被调用的方法的名字和参数;
因为我看在这本书的解释里,invoke()只是起到类似C语言中函数指针的功能;这段代码里我找不到关于打印输出的内容,可能是我因为不知道调用处理器的工作方式,望大神能解释一下;

  • 写回答

3条回答 默认 最新

  • sinat_36027429 2018-09-21 08:34
    关注

    好了,找到答案了。。原来以上不是完整代码,原书代码中间有个省略号,完整代码在后面几页有给出。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊