据我所知,CompiledMethod是一个持有编译形式的方法的类。每次编译方法时都会创建此类的实例。此实例保存在方法所属的类中。
我的问题是,如果我有一个方法的名称,我怎样才能获得保存方法的编译形式的实例,以便使用valueWithReceiver运行该方法?
是使用compiledMethodAt:selector吗?
答案 0 :(得分:3)
我认为我们需要更多背景。
因为使用反射机制,您甚至可以执行以下操作:
CompiledMethod allInstances select: [ :m | m selector = #asString ]
这将为您提供选择器asString
的所有方法。但这个动作很奇怪。
您也可以使用#detect:
代替#select:
来查找单个方法。
如果您需要评估所有找到的方法,可以使用:
CompiledMethod allInstances
select: [ :m | m selector = #asString ]
thenDo: [ :m | m valueWithReceiver: aReceiver ]
此外,如果您对一个层次结构的方法感兴趣,可以执行
YourClass withAllSubclassesDo: [ :class |
class
compiledMethodAt: #selector
ifPresent: [ :method | method valueWithReceiver: aReceiver ]
ifAbsent: [ "do nothing" ]
答案 1 :(得分:2)
如果你不确定,你收到的消息是什么,你可以随时询问结果课程。打印:
(Behavior compiledMethodAt: #compiledMethodAt:) class
在这种情况下,它是CompiledMethod
- 确切地说,你在寻找什么。
是的,您可以使用valueWithReceiver:
编译的方法。
答案 2 :(得分:0)
您可以让虚拟机为您查找方法,并使用如下表达式运行它:
object perform: selector
虚拟机将在对象的类中查找与选择器关联的方法,并以对象作为接收器运行它。此消息有类似形式的传递参数。