精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-18
最后修改:2010-11-19
一、先说一下AS3中的反射 public function getDefinitionByName(name:String):Object 返回 name 参数指定的类的类对象引用。
以下示例使用 GetDefinitionByNameExample 类在舞台上创建一个橙色的正方形。这是使用以下步骤完成的: 声明代表橙色背景颜色和 80 像素大小的变量,这些变量稍后将用于绘制正方形。 在构造函数内,将 Class 类型的变量 ClassReference 赋予 Sprite。 对名为 instance 的 ClassReference 的实例进行实例化。 由于 instance 按引用是 Sprite 对象,因此可以使用可用于 Sprite 的方法绘制正方形并将其添加到显示列表。
package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.utils.getDefinitionByName;
public class GetDefinitionByNameExample extends Sprite { private var bgColor:uint = 0xFFCC00; private var size:uint = 80;
public function GetDefinitionByNameExample() { var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class; var instance:Object = new ClassReference(); instance.graphics.beginFill(bgColor); instance.graphics.drawRect(0, 0, size, size); instance.graphics.endFill(); addChild(DisplayObject(instance)); } } }
注意,当我们使用自定义的类TestClass时,可能会报ReferenceError:Error #1065:变量TestClass未定义。 这是因为运行中反射,在SWF中取不到TestClass类编译的文件。即使import了也不行,因为import的类只要没有用到,还是会被编译器当作垃圾自动忽略掉。 解决办法也很简单,在工程别的地方用一下TestClass,或者在本类中声明一个未实例化的变量比如var tc:TestClass,或者直接TestClass不声明变量亦可。
二、看一下mx.core.Singleton的源码: private static var classMap:Object = {};
public static function registerClass(interfaceName:String,clazz:Class):void{ var c:Class = classMap[interfaceName]; if(!c) classMap[interfaceName] = clazz; }
public static function getClass(interfaceName:String):Class{ return classMap[interfaceName]; }
public static function getInstance(interfaceName:String):Class{ var c:Class = classMap[interfaceName]; if(!c) { throw new Error("No class registered for interface '" + interfaceName + "'."); } return c["getInstance"](); } 代码很简洁,比如在类FlexModuleFactory中注册: Singleton.registerClass("mx.managers::IHistoryManager", Class(getDefinitionByName("mx.managers::HistoryManagerImpl")));
比如在DataGridColumn中取出: _embeddedFontRegistry = IembeddedFontRegistry( Singleton.getInstance("mx.core::IembeddedFontRegistry"));
需要注意的是这句:return c["getInstance"](); 它等于上面例子中的写法: var ClassReference:Class = getDefinitionByName("interfaceName") as Class; var instance:Object = new ClassReference(); return instance.getInstance();
三、参考链接:How to use mx.core.Singleton(http://www.duzengqiang.com/blog/post/607.html) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 2926 次