zoukankan      html  css  js  c++  java
  • 【教程】【FLEX】#004 反射机制

    总结:

    目前用到反射的主要有两个方法

      1.  getDefinitionByName    //根据类名,返回对象(反射实例化对象)

            2.  describeType                 //根据对象,返回XML格式的属性,方法等信息(反射得到对象的属性和方法)

    3.  这两个混用,根据一个类名,获取它的所有属性、方法(不包括 private,protected,  [Bindabel] 修饰的 || static 的属性,直接传入类名,就可以获取到)


    声明:

    由于刚接触Flex不是很久,所以对Flex不是很了解。反射这一块,了解的不是很深。只够 基本的应用。

    如果有什么地方有问题,请指出来。   谢谢。

    Q:什么事件,事件的作用?

    引用:http://www.cnblogs.com/cj723/archive/2007/03/22/683951.html (C#的反射)

    (PS:这个博主,是参照 《大话设计模式》里面的,不过博主把代码也粘上去了,方便看源代码。)

    题外话:

    说到大话系类的书籍,我还是很喜欢的。看这种书籍,就像看故事一样,不会累。而且一个个故事又何尝不是一个个实际中使用例子呢?

    所以,看的轻松,又可学习到如何运用,在上面场景应用,有什么好处?

    何乐而不为呢?

    不过学习还是需要耐心的。再好的书籍也是只是一个引导,需要自己的努力。

                                                                                                                        -------zhongxia


    公司有一个项目,需要根据控件的类名(eg: mx.controls.Button,这些类名是存放在数据库中)来生成相对应的控件。

    实现思路(简单的思路,勿吐槽):

        1、获取控件的类名

        2、反射得到相对应的类

        3、生成相对应的控件,添加到面板中

    代码例子(片段): 根据类名(字符串),实例化一个类

    var controlType:String = datas[0].Appoint;   //获取控件类名,data是数据库读出来的数据
    
    var classRefrence:Class = getDefinitionByName(controlType) as Class;  //反射成对应的类
    
    var control:UIComponent = new classRefrence() as UIComponent;       //实例化控件
    
    this.addChild(control);       //添加控件到面板中(Flex3.0的方法,Flex4.0需要用  addElement(control); )

    反射当然不是只有上面这个小伎俩啦,反射还可以做到:1、反射出这个类的所有方法 (公有的)  2、反射出方法,并执行它。 etc....

    一个常用的反射类。(想了解源代码,请下载该文件,研究研究。简单的反射机制就有了点了解。)

    ReferenceUtil.as

    地址:【Flex资源】#500 常用反射类

    里面提供的方法:

    1、传入一个对象,获取类名

    2、传入类名和属性名,获取属性值

    3、传入类名,方法名,和参数,然后执行这个方法。

    4、获取一个对象的所有方法(公有的)。

    5、获取一个对象的所有属性(公有的,[Bindabel]也获取不到)。


    上面直接放了一个代码文件,看代码还需要下载下来,比较麻烦。所以这边粘一个获取所有公有属性的方法出来。

    方便阅读。

    采用的是describeType的方法。

    /**
    
     * 传入一个对象,获取这个对象里面的所有属性,并返回JSON格式的字符串
    
     * @time  2014年12月27日 21:29:45
    
     * */
    
    public function getJsonFromObject(obj:Object):String
    
    {
    
      if(obj == null)
    
      { 
    
        return "";
    
      }
    
      var json:String ="{";
    
      var properties:XMLList  = describeType(obj).variable;
    
      for each(var property:XML in properties){
    
          //@ 是出现在flex解析xml时用到,非XML无法使用,会报错
    
           // @指属性,不加@的是指其子节点
    
        var propertyName:String = property.@name;
    
        json += """ + propertyName + "":"" + obj[propertyName] + "","; 
    
      }
    
      json = json.substr(0,json.length-1);
    
      json += "}";
    
      return json;
    
    }

    题外知识:

    Flex 中 @的含义:注意,只有解析XML的时候才可以用(尝试解析过Object对象,报错)

    clipboard[6]

  • 相关阅读:
    Python全栈开发记录_第七篇(模块_time_datetime_random_os_sys_hashlib_logging_configparser_re)
    Python全栈开发记录_第六篇(生成器和迭代器)
    Python全栈开发记录_第五篇(装饰器)
    Python全栈开发记录_第四篇(集合、函数等知识点)
    Python全栈开发记录_第三篇(linux(ubuntu)的操作)
    Python全栈开发记录_第二篇(文件操作及三级菜单栏增删改查)
    Python全栈开发记录_第一篇(循环练习及杂碎的知识点)
    NET控件Designer架构设计
    如何把Excel中的单元格等对象保存成图片
    “某某云词典” – 纠结的初体验
  • 原文地址:https://www.cnblogs.com/zhongxia/p/4190013.html
Copyright © 2011-2022 走看看