一、先说一下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)
分享到:
相关推荐
perl-Class-Singleton-1.4-6.el6.noarch.rpm perl-Class-Singleton-1.4-6.el6.noarch.rpm
**PyPI 官网下载 | dask-actor-singleton-1.1.0.tar.gz** 在Python的世界里,PyPI(Python Package Index)是官方的软件仓库,它为开发者提供了发布和分享Python软件包的平台。`dask-actor-singleton-1.1.0.tar.gz`...
在iOS应用开发中,单例模式是一种常用的编程设计模式,它确保了类只有一个实例,并提供一个全局访问点。这个模式在iOS开发中的应用非常广泛,特别是在处理系统资源、网络请求、数据存储等需要全局共享的对象时。在...
8. **对象创建与克隆(Object Creation and Cloning)**:`ObjectUtils`和`Singleton`类提供了对象创建和克隆的辅助方法,如无参构造器创建对象,安全的单例模式实现等。 9. **类型转换(Type Conversion)**:`...
python库。 资源全名:django-singleton-admin-0.0.2.macosx-10.7-intel.exe
离线安装包,亲测可用
7. 枚举单例:最安全且推荐的方式,天然防反射攻击和序列化攻击。 ```java public enum Singleton { INSTANCE; public void whateverMethod() {} } ``` 在《ant求职记之设计模式》这篇博文中,作者可能通过一个...
- 单例模式3使用了内部类来实现单例。SingletonHolder是一个私有的静态内部类,在Singleton类被加载时,SingletonHolder不会被加载,因此不会立即实例化Singleton。当getInstance()方法首次被调用时,...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
单例模式是软件设计模式中的一种经典模式,它主要用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在处理全局资源、线程共享对象以及需要频繁创建和销毁的对象时非常有用,可以减少...
Python库SingletonProcess-0.1.0rc0-py3-none-any.whl是一个针对Python编程语言的特定版本(Python 3)的后端开发资源。这个库的主要功能是实现单例进程模式,这是一种设计模式,它确保一个类只有一个实例,并提供一...
3. **双重检查锁定(DCL)单例**: 为了解决懒汉式单例的线程安全问题,可以采用DCL,既保证了线程安全,又实现了懒加载: ```cpp class Singleton { private: Singleton() {} volatile static bool initialized;...
单例模式是软件设计模式中的一种基础且广泛应用的模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、缓存等场景下非常常见,因为它可以避免因频繁创建和销毁对象而...
在Java编程中,单例模式是一种常用的创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。本主题探讨的是线程安全的单例模式实现,特别是饥饿模式(Starvation)和延迟加载(Lazy Initialization)...
- **Scopes**:`@Scope`注解可以限制依赖的生命周期,如`@Singleton`表示单例,`@ActivityScoped`或`@FragmentScoped`用于限制到特定的Android组件。 【压缩包子文件的文件名称列表】:NetEase-Dagger-4f9408f 这...
官方离线安装包,亲测可用
3. **在Qml中使用Singleton**: 在Qml文件中,你可以使用Singleton组件来实例化并访问这个单例对象: ```qml import QtQuick 2.0 import com.example.singleton 1.0 Singleton { id: mySingleton } Text ...