我正和我的伙伴聊聊这件事,他确信你可以做到这一点并说他已经做到了,但是我无法让它发挥作用。
我想知道它是否甚至可能。我尝试在外部下载的SWF中键入一个var作为一个类,然后创建一个实例,但是不能这样做。
一些代码
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文件来创建我的类的实例。
感谢
答案 0 :(得分:7)
你需要做两件事:
Dashboard
一个包(package.to.Dashboard
)。无包类被赋予编译形式的不同属性(受保护的命名空间),而不是具有包的属性,使外部SWF无法访问它们。然后,您应该可以使用加载的SWF中的getDefinitionByName
和new
返回Class
。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
所以看起来你不能创建一个类的实例,除非它在项目SWF中被编译。
尝试ModuleLoader
课程。请参阅this有关如何创建模块的文章。
答案 3 :(得分:0)
我建议使用CASALib。我创建了一个完整的应用程序,直到运行时我都不知道类名。我刚刚制作了一些接口,以确保最重要的功能始终可用。名为LibraryManager的CASALib util具有从外部SWF实例化类的功能。
答案 4 :(得分:0)
您可能想要这样做:
var dash:Class = Loader(e.target).contentLoaderInfo
.applicationDomain.getDefinition("Dashboard") as Class;
getDefinitionByName()
适用于当前swf而不是外部swfs加载的类。对于外部swf,您需要提供实际加载特定swf的loader对象的引用。
此外,如果您在FlashBuilder中执行此操作,请确保您加载的SWF中的“主应用程序”是 Sprite (或者可能是MovieClip,但我没有测试那个),而不是一个应用程序(正如你在为新的SWF项目创建的默认MXML文件中得到的)。否则,上面的代码将无法找到您正在寻找的类定义。