2014-12-11 4 views
2

Насколько я понимаю, CompiledMethod - это класс, содержащий скомпилированную форму метода. Экземпляр этого класса создается каждый раз при компиляции метода. Этот экземпляр сохраняется в классе, к которому принадлежит метод.Получение экземпляра класса CompiledMethod

Мой вопрос в том, есть ли у меня имя метода, как я могу получить тот экземпляр, который содержит форму компиляции метода для запуска этого метода с valueWithReceiver:?

это с помощью compiledMethodAt: selector?

+1

Стоит попробовать :) – MartinW

+0

Я пытаюсь .. просто надеюсь, что я не делаю все это неправильно. :-) – Ohad

ответ

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" ] 
+0

hey Uko..I действительно нужно получить все методы с тем же именем (в цепочка наследования), поэтому я старался: CompiledMethod allInstances select: [: m | m selector = #asString] .. но он не работает ... это скомпилированный метод? могу ли я запустить каждый т внутри этого блока? – Ohad

+0

@Shiran Я добавил объяснение, как оценить все найденные методы и опцию для иерархии – Uko

+0

Спасибо .. попробуем это скоро :-) – Ohad

2

Если вы не конечно, что вы получаете как ответ на отправку сообщения, вы всегда можете попросить класс результатов. Print:

(Behavior compiledMethodAt: #compiledMethodAt:) class 

В этом случае CompiledMethod - именно то, что вы искали. И да, вы можете использовать скомпилированный метод с valueWithReceiver:.

+0

Это работает :-) Я использовал compiledMethodAt, чтобы получить экземпляр скомпилированного метода. спасибо – Ohad

0

Вы можете сделать виртуальную машину искать способ для вас, и запустить его с выражением, как:

object perform: selector 

Виртуальная машина будет искать способ, связанный с селектором в классе объекта, и запустить он с объектом в качестве приемника. Существуют аналогичные формы этого сообщения для передачи параметров.

+0

, поэтому, выполняя это, он будет запускать все методы, связанные с селектором? – Ohad

+0

Мне нужно запустить методы, которые я переопределил, а также новый метод – Ohad

+0

Он будет запускать единственный метод, который находит процедура поиска виртуальной машины. Поиск начинается с класса получателя и проходит через суперклассы этого класса через класс Object. Если метод не найден, он будет сигнализировать об ошибке MessageNotUnderstood. Чтобы запустить переопределенные методы, используйте метод ValueWithReceiver: вышеизложенное. –

Смежные вопросы