我创建了一个类,在那个类中我有一个方法'sendMessage: to: withArgs:',它接收一个对象、一个消息和一个参数数组。该方法用于向对象发送消息并执行一些算法。要使用此方法,我必须创建我创建的类的实例 x 并执行 x sendMessage: '+' to: '7' withArgs: '#(5)' 之类的操作。使用参数 5 向对象 7 发送消息“+”的结果,以及我的算法所做的一些事情。但我想要的是该算法将在每个方法调用中使用,这意味着 7+5 将调用我的'sendMessage: to: withArgs:'。我怎样才能做到这一点?或者至少,在发送给每个对象的每个方法中是否调用了某些东西?
4 回答
在 Squeak 中,请参见 ObjectTracer 类。类注释描述了如何使用它。你应该能够用它来完成你所需要的,或者至少用它作为模型。
这有点有趣,我们刚刚在 Squeak irc 频道中讨论过这个问题。或许可以看看 ObjectViewer。
在您的示例中,您希望拦截发送到 SmallInteger 的消息。有趣的是,ObjectViewer 几乎可以与每个类一起使用,但 SmallInteger 除外。
因此,要拦截发送到 myObject 的消息,请执行此操作。
创建类 Intercepter,让它继承自 ObjectTracer,也许。将 doesNotUnderstand 更改为对您有用的内容:
doesNotUnderstand: aMessage
"do Mojo to aMessage as you describe it"
然后,为了让你的东西继续运行,创建你的拦截器:
myIntercepter := Intercepter on: myObject.
接着
myObject become: myInterceptor.
看看反射率。
不幸的是,一些论文链接不起作用,我不记得从头顶发出的确切调用,但是根据需要检测代码真的很容易,甚至在运行时也可以。使用 class 查找示例Link
。
您可以使用方法包装器。要查看方法包装器是什么,您可以查找一篇名为“Wrappers to the rescue”的论文。我认为有一个已经实现方法包装器的 squeak 包。此外,您可以看到在最新版本的 Pharo 中如何进行测试代码覆盖分析,因为它使用一种方法包装器来查看在测试运行期间评估了哪些方法。干杯,加博托