我的主应用程序包含ModuleManager
。此应用程序加载了不同的模块。主应用程序和加载的模块都使用我的自定义RSL。我需要在我的RSL中获取Class对象,该对象在其中一个模块中定义。我正在尝试使用getDefinitionByName
函数,但由于我的类没有在RSL中定义,因此我得到一个异常(尽管加载了需要类的模块)。是否可以使模块类对RSL代码可见并在运行时获取它的实例而不改变项目结构?感谢
答案 0 :(得分:1)
如果在类型为Class的Module(或其接口)上公开属性,则可以注入类的定义,类似于将类定义注入到按钮中以制作图标。
因此,您的模块可能包含以下代码:
protected var _classToMake:Class;
public function get classToMake():Class {
return _classToMAke;
}
public function set classToMake(value:Class):void {
if (value != _classTomake) {
if (value != null) {
//test to make sure we're making the right thing
var testClass:SomeType = new value() as SomeType;
if (testClass != null) {
_classToMake = value
} else {
trace('classToMake must be a definition that makes a class of SomeType');
}
}
}
}
答案 1 :(得分:1)
加载新模块时,请指定应用程序域。正如文件所说:
"The ApplicationDomain class is a container for discrete groups of class definitions."
在加载SWF时,将应用程序域指定为加载程序上下文的一部分。
一旦您有对模块加载到的Application Domain的引用,您可以调用Application Domain的getDefinition()
方法来获取定义,其方式与getDefinitionByName()
非常相似
另请参阅以下文档“使用应用程序域”,以获得有关其工作原理的详细说明。
http://help.adobe.com/en_US/as3/dev/WSd75bf4610ec9e22f43855da312214da1d8f-8000.html
这是一个示例的复制粘贴,只是因为徘徊:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class ApplicationDomainExample extends Sprite
{
private var ldr:Loader;
public function ApplicationDomainExample()
{
ldr = new Loader();
var req:URLRequest = new URLRequest("Greeter.swf");
var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.load(req, ldrContext);
}
private function completeHandler(event:Event):void
{
var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class;
var myGreeter:Greeter = Greeter(event.target.content);
var message:String = myGreeter.welcome("Tommy");
trace(message); // Hello, Tommy
}
}
}