能否阅读(可能还可以更改)核心Flash类文件的源代码?

7

我想阅读flash.net.FileReference类的源代码。这是否可能?我在哪里可以找到源文件,它们是否随Adobe Flash或Flash Builder一起提供?


4
你希望改变什么?我建议创建一个自定义类来扩展 FileReference 并覆盖你想要更改的函数。 - Corey
嗯,是的,你的方法肯定更干净,但这不是重点 - 我可以在任何地方阅读它们吗? - jayarjo
3个回答

6
为了读取flash包文件,您可以找到playerglobal.swc文件-将其更名为playerglobal.zip并解压缩该包。然后,反编译library.swf文件并获取脚本文件。以下是我为FileReference找到的内容:
//FileReference
package flash.net 
{
    import flash.events.*;
    import flash.utils.*;

    public class FileReference extends flash.events.EventDispatcher
    {
        public function FileReference()
        {
            super();
            return;
        }

        public function upload(arg1:flash.net.URLRequest, arg2:String="Filedata", arg3:Boolean=false):void
        {
        }

        private function _load(arg1:flash.utils.ByteArray):void
        {
        }

        public function load():void
        {
            this._load(new ByteArray());
            return;
        }

        public function get size():uint
        {
        }

        public function get type():String
        {
        }

        public function browse(arg1:Array=null):Boolean
        {
        }

        public function get name():String
        {
        }

        public function get creator():String
        {
        }

        public function get creationDate():Date
        {
        }

        public function download(arg1:flash.net.URLRequest, arg2:String=null):void
        {
        }

        public function get modificationDate():Date
        {
        }

        public function get data():flash.utils.ByteArray
        {
        }

        public function cancel():void
        {
        }

        private function _save(arg1:flash.utils.ByteArray, arg2:String):void
        {
        }

        public function save(arg1:*, arg2:String=null):void
        {
            var defaultFileName:String=null;
            var data:*;
            var d:flash.utils.ByteArray;

            var loc1:*;
            data = arg1;
            defaultFileName = arg2;
            d = new ByteArray();
            if (data == null) 
            {
                throw new ArgumentError("data");
            }
            if (data is String) 
            {
                d.writeUTFBytes(data as String);
            }
            else if (data is XML) 
            {
                d.writeUTFBytes((data as XML).toXMLString());
            }
            else if (data is ByteArray) 
            {
                d.writeBytes(data as ByteArray);
            }
            else 
            {
                try 
                {
                    d.writeUTFBytes(data);
                }
                catch (e:Error)
                {
                    throw new ArgumentError("data");
                }
            }
            d.position = 0;
            if (defaultFileName == null) 
            {
                defaultFileName = "";
            }
            this._save(d, defaultFileName);
            return;
        }
    }
}

我强烈建议不要更改此文件,而是扩展它并覆盖您需要修改的函数。否则,您将需要重新编译library.swf并创建自定义playerglobal.swc。

这些虚拟方法代表什么?FileReference实际上是内置类的一个例子,可能无法更改?实际上,我想知道upload()方法如何管理直接流式传输,而不将文件加载到内存中,并在我的应用程序中模拟它。如果有可能实现这一点,我不介意进行一些猴子补丁。 - jayarjo

3
正如其他人提到的那样,您可以查看Flash和Flex框架类的源代码。确切的位置会有所不同。
对于Windows 7上的Flash CS4:
C:\Users\\AppData\Local\Adobe\Flash CS4\en\Configuration
对于Flex:
...\flex_sdk\frameworks\projects\framework\src
只要小心,您就可以更改任何框架类,这在Flash术语中称为Monkey Patching。在您的项目中创建一个与框架类完全相同的包结构和类名的类,编译器将找到并使用您的自定义类而不是框架类。
这样做可能会涉及一些框架RSL的复杂性。关于此,请参见以下内容:
如何在使用Flex RSL时进行Monkey Patching

http://blogs.adobe.com/dloverin/2010/01/how_to_monkey_patch_when_using_flex_rsls.html

这不适用于内置类或“固有”类。它们已经内置在播放器中,并且仍然具有上述源位置中的存根代码。您无法实际更改固有类。

感谢您的深入发帖 - 非常有启发性。FileReference是内置类吗? - jayarjo
2
@jayarjo,是的,FileReference是内置的,或者至少部分内置。看一下源代码,你会发现许多方法都是空的。这是因为它们的代码是由运行时提供的本地代码。 - Samuel Neff

0

你可以在以下路径中找到任何可供查看的“东西”(适用于Win7):C:\Users\<your_user>\AppData\Local\Adobe\Flash CS4\en\Configuration

Flash CS4部分可能会根据你所使用的版本而有所不同。类文件位于配置文件夹内的Classes文件夹中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接