Переопределение именованных функций во время выполнения - PullRequest
3 голосов
/ 26 марта 2011

То, что я пытаюсь сделать, немного странно, но мне интересно, может ли кто-нибудь придумать умный способ сделать то, что я хочу сделать.По сути, я хочу переопределить именованную функцию во время выполнения.Я могу сделать это с помощью анонимных функций, но я не могу найти способ сделать это для именованных функций.Я хочу сделать это так, чтобы я мог реализовать «шпионскую» функциональность для объекта для инфраструктуры тестирования (порт Jasmine to Flex).

Возьмем, к примеру, этот класс:

public class TestClass
{
    public var anonymous:Function = function():void { 
        trace("original anonymous"); 
    };

    public function named():void {
        trace("original named");
    }
}

Я могу легко переопределить анонимную функцию, потому что это просто переменная.Javascript часто использует эту идиому.

var testClass:TestClass = new TestClass();
testClass.anonymous = function():void { trace("overridden anonymous"); }

НО, когда я делаю то же самое для именованных функций, вы получаете ошибку во время компиляции:

// Does not compile
testClass.named = function():void { trace("overridden named"); }

Я пытался сделать это немного более "мягким", ноэто приводит к сбою во время выполнения «Невозможно назначить метод, названный в TestClass».

// Compiles with runtime failure
testClass["named"] = function():void { trace("overridden named"); }

Может кто-нибудь более умный, чем я, придумал способ взломать это?Можно ли перехватить байт-код?Что-то?

Ответы [ 3 ]

1 голос
/ 26 марта 2011

Я хочу изменить объект, а не класс

Но объект не содержит функций, только нестатические переменные.Я попытался использовать свойство prototype и заменить метод там, но вместо введенного метода вызывается оригинальный метод.

О байт-коде "hack", вы имеете в виду "hack" уже загруженный SWF во время выполнения?Я думаю, что это невозможно.Я уверен, что вы можете проанализировать SWF с помощью as3swf, найти метод в байт-коде, заменить его и сохранить результат в новом SWF.

0 голосов
/ 26 марта 2011

простой способ выполнить то, что вы хотите, это просто передать новую функцию исходной функции и выполнить ее оттуда:

package
{
//Imports
import flash.display.Sprite;

//Class
public class RedefineFunction extends Sprite
    {
    //Constructor
    public function RedefineFunction()
        {
        originalFunction();

        originalFunction(redefinedFunction);
        }

    //Original Function
    public function originalFunction(redefinition:Function = null):void
        {
        if  (redefinition != null)
            redefinition();
            else
            trace("Original Function Definition");
        }

    //Redefined Function
    private function redefinedFunction():void
        {
        trace("Redefined Function Definition")
        }
    }
}

следы:

Original Function Definition
Redefined Function Definition
0 голосов
/ 26 марта 2011

У меня была идея сделать функцию «кеш». Это может работать с тем, что вам нужно.

Допустим, у вас есть класс "Car" с методом, который необходимо переопределить во время выполнения:

public class Car extends Sprite
{
    private var functionCache:Function;

    public function Car()
    {
        super();
    }

    public function flexibleFunction(functionBody:*=null):void{
        if(functionBody is Function){
            functionBody.call();
            functionCache=functionBody;
        } else {
            functionCache(functionBody);
        }
    }
}

Использование:

public class Main extends Sprite
{
    private var car:Car;

    public function Main()
    {
        car = new Car();

        car.flexibleFunction(function(){trace("redefine test #1")});

        car.flexibleFunction();

        car.flexibleFunction(function(doParametersWork:String="let's see"){trace("redefine test #2: " + doParametersWork);});

        car.flexibleFunction("yes they do");

        car.flexibleFunction();

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...