综合http://blog.youkuaiyun.com/liyong199012/article/details/6085545
http://blog.sina.com.cn/s/blog_7e2d7da8010130gt.html
http://blog.youkuaiyun.com/hu36978/article/details/4718840
下面转自 http://bbs.9ria.com/thread-133293-1-1.html
总结下as3反射的相关用法,主要是四个函数:
flash.system.ApplicationDomain.getDefinition(linkName:String):Class; //flashcs元件库中的某个元件链接名称
flash.utils.getDefinitionByName(name:String):Object; //返回name参数指定的类的类对象引用
flash.utils.getQualifiedClassName(value:*):String; //返回对象的完全限定类名
flash.utils.getQualifiedSuperClassNameTest; // 返回value参数指定的对象的基类的完全限定类名。
在as3.0中,你会发现在flash.utils包中有一系列函数提供了反射的功能。主要包含以下功能:
* 确定对象的类
* 确定接口声明的常数和方法
* 获取类的成员、构造函数、方法、父类信息
* 在运行时根据类名创建类的实例
* 在运行时根据成员名称来调用对象成员
* 在运行时根据方法名称来调用对象方法
看代码:
Main.as类
IPerson.as接口
PersonImplA.as类
PersonImplB.as类
package {
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class LoadSwfExample extends Sprite {
private var loader:Loader;
private var completeLoaded:Boolean;
private var urlRequest:URLRequest;
private var getSwf:MovieClip;//对swf对象的引用变量
public function LoadSwfExample() {
loader= new Loader();
urlRequest=new URLRequest("Loaded.swf");// 该文档与Loaded.swf在一个目录
/**
* 第二种方式才需要加上
* **/
var context : LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
/* 加载到同域(共享库) */
context.applicationDomain = ApplicationDomain.currentDomain;
//context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
//下面我只注册个complete事件,对IOErrorEvent的事件在实际操作时也要注册,以便检测错误
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.load(urlRequest);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);//主要是改变加载进来的swf的背景颜色
}
private function onComplete(e:Event=null):void {
// 第一种方式下面这句很关键, 将加载进来的Loaded.swf强制转化为MovieClip类型
getSwf=MovieClip(e.currentTarget.content);
//第二种方式
var runtimeClassRef:Class = getClass("Loaded");
getSwf = new runtimeClassRef() as MovieClip;
//把主swf传给动态加载的swf
getSwf.getParent(this);
//然后可以将其当做影片剪辑来使用 也可以操作swf里的全局变量
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onComplete);
getSwf.x=100;
getSwf.y=200;
addChild(getSwf);
completeLoaded=true;
}
private function onDown(e:MouseEvent):void {
if (completeLoaded) {
getSwf._text+=1;//这里操作了_text全局变量
//调用Loaded.swf里的drawbackground()方法
getSwf.drawBackground(Math.random()*0xFFFFFF);//随机颜色值
} else {
trace("正在加载,请等待...");
}
}
/**
*该方法得是public,不然动态加载的swf调用不了该方法
**/
public function moveSWF():void{
getSwf.x+=10;
getSwf.y+=10;
}
//使用反射的方式
private function getClass(className:String):Class
{
//return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
try
{
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
} catch (p_e : ReferenceError)
{
trace("定义 " + className + " 不存在");
return null;
}
return null;
}
}
}
Loaded.swf的代码如下
package {
//该文档的大小是400*200的
// 为了使该swf被夹在后,其他swf能够调用相关变量 则,则该变量必须设为public的公共属性
//强制转换失败的原因
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
public class Loaded extends MovieClip {
public var _text:Number;//文本内容, 其在加载后的swf里要用的 故将其设为public
private var shape:Shape;
public var _textField:TextField;
private var __parent:Object;
public function Loaded() {
_text=0;
shape=new Shape() ;//shape放在外面
drawTextField();
drawBackground(0x6699FF);
addChild(shape);//end draw
addChild(_textField);
}
private function drawTextField():void {
_textField=new TextField ;
_textField.border=true;
_textField.background=true;
_textField.borderColor=0x000000;
_textField.backgroundColor=0xFFFFFF;
_textField.width=300;
_textField.height=100;
_textField.defaultTextFormat=new TextFormat("Arial",16,0x000000);
_textField.restrict="0-9";
_textField.text=String(_text);
_textField.x=50;
_textField.y=50;
_textField.addEventListener(MouseEvent.CLICK,function():void{
trace(__parent);
if(__parent){
__parent.moveSWF();
}
});
}
//创建背景矩形 在其他swf可以改变背景颜色, 故将其设为public
public function drawBackground(color:uint):void {
_textField.text=String(_text);
shape.graphics.clear();
shape.graphics.lineStyle(2,0);//定义矩形边宽
//画矩形
shape.graphics.beginFill(color);
shape.graphics.drawRect(2,2,398,198);
shape.graphics.endFill();
}
public function getParent(_parent:Object) : void {
__parent=_parent;//通过__parent 就可以使用文档类里的方法和属性了。
}
public function setTextFun(msg:String):void{
trace("msg =" + msg);
}
}
}