2

我创建了一个类,在那个类中我有一个方法'sendMessage: to: withArgs:',它接收一个对象、一个消息和一个参数数组。该方法用于向对象发送消息并执行一些算法。要使用此方法,我必须创建我创建的类的实例 x 并执行 x sendMessage: '+' to: '7' withArgs: '#(5)' 之类的操作。使用参数 5 向对象 7 发送消息“+”的结果,以及我的算法所做的一些事情。但我想要的是该算法将在每个方法调用中使用,这意味着 7+5 将调用我的'sendMessage: to: withArgs:'。我怎样才能做到这一点?或者至少,在发送给每个对象的每个方法中是否调用了某些东西?

4

4 回答 4

2

在 Squeak 中,请参见 ObjectTracer 类。类注释描述了如何使用它。你应该能够用它来完成你所需要的,或者至少用它作为模型。

于 2009-05-20T16:30:38.290 回答
2

这有点有趣,我们刚刚在 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.
于 2009-05-20T16:31:20.113 回答
2

看看反射率

不幸的是,一些论文链接不起作用,我不记得从头顶发出的确切调用,但是根据需要检测代码真的很容易,甚至在运行时也可以。使用 class 查找示例Link

于 2009-05-25T10:00:29.463 回答
1

您可以使用方法包装器。要查看方法包装器是什么,您可以查找一篇名为“Wrappers to the rescue”的论文。我认为有一个已经实现方法包装器的 squeak 包。此外,您可以看到在最新版本的 Pharo 中如何进行测试代码覆盖分析,因为它使用一种方法包装器来查看在测试运行期间评估了哪些方法。干杯,加博托

于 2009-05-20T21:44:38.860 回答