(转)AS反射应用

总结下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类

  1. package
  2. {
  3. import flash.display.MovieClip;
  4. import flash.display.Shape;
  5. import flash.display.Sprite;
  6. import flash.system.ApplicationDomain;
  7. import flash.utils.getDefinitionByName;
  8. import flash.utils.getQualifiedClassName;
  9. import flash.utils.getQualifiedSuperclassName;
  10. import test.IPerson;
  11. import test.PersonImplA;
  12. /**
  13. * as3反射实例
  14. * @author xuechong
  15. * @language as3 fp9
  16. * @date 2012.06.03
  17. * @QQ群交流 241294271
  18. * */
  19. public class Main extends Sprite
  20. {
  21. //private var _personAersonImplA;
  22. public function Main()
  23. {
  24. //getDefinitionFunc();
  25. getDefinitionByNameFunc();
  26. //getQualifiedClassNameFunc();
  27. //getQualifiedSuperClassNameFunc();
  28. }
  29. /**
  30. * flash.system.ApplicationDomain类中的一个函数
  31. * aa字符串就是flashcs元件库中的链接名称(也就是元件绑定的类的名字)
  32. */
  33. public function getDefinitionFunc():void
  34. {
  35. var app:ApplicationDomain = ApplicationDomain.currentDomain;
  36. try
  37. {
  38. var cls:Class = app.getDefinition("aa") as Class;
  39. var mc:MovieClip = new cls() as MovieClip;
  40. mc.y = 300;
  41. this.addChild(mc);
  42. }
  43. catch(error:ReferenceError)
  44. {
  45. trace("反射错误", error.message);
  46. }
  47. }
  48. /**
  49. * flash.utils.getDefinitionByName(name:String):Object
  50. * 返回name参数指定的类的类对象引用
  51. * 注:如果是自定义类则要先定义上此类的引用
  52. * */
  53. public function getDefinitionByNameFunc():void
  54. {
  55. var ClassReference:Class = getDefinitionByName("test.PersonImplA") as Class; //[class PersonImplA]
  56. var obj:IPerson = new ClassReference() as IPerson; //[object PersonImplA]
  57. obj.sayHello();
  58. }
  59. /**
  60. * flash.utils.getQualifiedClassName(value:*):String
  61. * 返回对象的完全限定类名
  62. * */
  63. private function getQualifiedClassNameFunc():void
  64. {
  65. var sh:Shape = new Shape();
  66. trace(getQualifiedClassName(sh)); //flash.display::Shape
  67. var aersonImplA = new PersonImplA();
  68. trace(getQualifiedClassName(a)); //test:ersonImplA
  69. trace(getQualifiedClassName(this)); //Main
  70. }
  71. /**
  72. * flash.utils.getQualifiedSuperClassNameTest
  73. * 返回value参数指定的对象的基类的完全限定类名。
  74. * 即返回继承关系上的父类
  75. * */
  76. private function getQualifiedSuperClassNameFunc():void
  77. {
  78. var sh:Shape = new Shape();
  79. trace(getQualifiedSuperclassName(sh)); //flash.display:isplayObject
  80. var aersonImplA = new PersonImplA();
  81. trace(getQualifiedSuperclassName(a)); //flash.display::Sprite
  82. trace(getQualifiedSuperclassName(this)); //flash.display::Sprite
  83. }
  84. }
  85. }



IPerson.as接口

  1. package test
  2. {
  3. public interface IPerson
  4. {
  5. function sayHello():void;
  6. }
  7. }



PersonImplA.as类

  1. package test
  2. {
  3. import flash.display.Sprite;
  4. public class PersonImplA extends Sprite implements IPerson
  5. {
  6. public function PersonImplA()
  7. {
  8. }
  9. public function sayHello():void
  10. {
  11. trace("This is PersonImplA");
  12. }
  13. }
  14. }


PersonImplB.as类

  1. package test
  2. {
  3. import flash.display.Sprite;
  4. public class PersonImplB extends Sprite implements IPerson
  5. {
  6. public function PersonImplB()
  7. {
  8. }
  9. public function sayHello():void
  10. {
  11. trace("This is PersonImplB");
  12. }
  13. }
  14. }



(原)as3反射实例.rar

来自:http://bbs.9ria.com/thread-133293-1-1.html

posted @ 2012-09-14 13:26  ☆A希亿  阅读(318)  评论(0编辑  收藏  举报