3

動的プロキシ クラスに動的に追加された関数を使用して簡単に実行できることはわかっていますが、Python のデコレータでできるように、型指定された関数の呼び出しもインターセプトできるようにしたいと考えています。以下の例。すでに「dynFunc」を通過しているように、「typedFunc」の「callProperty」を通過できる方法が欲しいです。

例

package
{
    import flash.display.Sprite;
    [SWF(width = '400', height = '400')]
    public class Test extends Sprite
    {
        public function Test()
        {
            var t:TypeTest = new TypeTest();
            t.dynFunc = function dynFunc(s:String, i:int):Boolean { return true; };

            t.typedFunc("a", 1);
            t.dynFunc("b", 2);
        }
    }
}
import flash.utils.Proxy;
import flash.utils.flash_proxy;

internal dynamic class TypeTest extends Proxy
{
    private var customs:Object = new Object();
    override flash_proxy function callProperty(name:*, ...parameters):* {
        var retval:* = (this[name] as Function).apply(null, parameters);
        trace("called", name, "with", parameters);
        return retval;
    }
    public function typedFunc(s:String, i:int):Boolean {
        return false;
    }
    override flash_proxy function getProperty(name:*):* { return customs[name]; }
    override flash_proxy function setProperty(name:*, value:*):void { customs[name] = value; }
}
4

1 に答える 1

2

これを ActionScript で行うのは簡単ではありません。コンパイラは、「通常の」ActionScript 言語構造を使用して実行時にシール クラスのメソッドを変更することを許可しないためです。そのため、元のクラスの動作を変更することはできません。限目。

幸いなことに、as3commons:bytecodeライブラリがあります。これを使用して、実行時に動的プロキシ クラスを生成できます。クラスのバイト配列表現を生成し、それを AVM にロードするため、他のクラスと同様に使用できます。元のクラスを設計図として使用し、それを変更したバージョンに置き換えることさえ可能かもしれませんが、私はそれを試していないことを認めなければなりません.

于 2012-04-20T21:22:41.907 に答える