从外部SWF实例化AS3类

4

我和我的朋友谈论了这个问题,他相信你可以做到并且说他已经做到了,但是我无法使它起作用。

我在想这是否有可能。我尝试将一个变量作为一个类输入,该类位于外部下载的SWF中,然后创建一个实例,但是无法实现。

一些代码

private static function onCompleteHandler(e:Event) {
dashboardObject = e.target.content;
// registerClassAlias("Dashboard", ); doesnt work
var dash:Class = getDefinitionByName("Dashboard") as Class;
var myDash = new dash();
trace(myDash.show);
}

错误

ReferenceError: Error #1065: Variable Dashboard is not defined.
at global/flash.utils::getDefinitionByName()
at System$/onCompleteHandler()

所以似乎除非编译在项目SWF中,否则无法创建类的实例。 如果是真的,那就是我想要的。 我不希望人们仅通过下载这里所构建的SWF文件就尝试创建我的类的实例。

谢谢

5个回答

7
你需要做两件事情:
  1. Dashboard 添加一个包名 (package.to.Dashboard)。没有包名的类在编译后会被赋予不同的属性(受保护的命名空间),与有包名的类不同,这使它们无法被外部 SWF 访问。
  2. 确保你加载的 SWF 和父级处于相同的 ApplicationDomain 中。
然后你就能够使用 getDefinitionByName 函数获取已加载 SWF 的定义并通过调用 new 方法实例化返回的 Class 对象。

3
var loader:Loader = new Loader();
var req:URLRequest = new URLRequest("foo.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fooLoadComplete);
loader.load(req);


function fooLoadComplete(e:Event):void
{
    var ClassDefinition:Class = e.target.applicationDomain.getDefinition("Symbol1") as Class;
    var sym1:MovieClip = new ClassDefinition();

    this.addChild(sym1);
}

工作得非常好,只是我不得不扩展我的自定义类与MovieClip,以便我可以使用新的类定义来实例化“sym1”。这并不是什么大问题,因为之后我仍然可以访问它的所有扩展函数/特性。此外,我包含的SWF文件是由Flash开发创建的,要从该SWF文件中获取公共类,我只需将类名放在'Main'中(不要留空),编译器就会包含该类。 - CenterOrbit

0
你可能想要这样做:
var dash:Class = Loader(e.target).contentLoaderInfo
    .applicationDomain.getDefinition("Dashboard")  as  Class;

getDefinitionByName()适用于当前swf加载的类,而不是外部swf。对于外部swf,您需要提供实际加载特定swf的加载器对象的引用。

此外,如果您在FlashBuilder中进行此操作,请确保您加载的SWF中的“主应用程序”是Sprite(或可能是MovieClip,尽管我没有测试过),而不是应用程序(在为新SWF项目创建的默认MXML文件中)。否则,上面的代码将无法找到您要查找的类定义。


0

我建议使用CASALib。我曾经创建过一个完整的应用程序,在其中直到运行时才知道类名。我只是创建了一些接口,以确保最重要的函数始终可用。CASALib工具中的LibraryManager函数可以从外部SWF实例化一个类。


0
看起来你无法实例化一个类,除非它是在项目 SWF 中编译的。
尝试使用 ModuleLoader 类。请参考this文章了解如何创建模块。

我只是想向某些人确认一下这是否可能,因为他们可以轻松地创建静态类的实例并更改变量,而您可能不希望他们更改,特别是在构建API时,您需要某些变量对外公开以供API使用。这篇文章似乎是关于Flex的,而我目前没有涉及到它。谢谢。 - Chris

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