【问题标题】:How can I use Reflection (Mirrors) to access the method names in a Dart Class?如何使用反射(镜像)访问 Dart 类中的方法名称?
【发布时间】:2012-11-03 01:41:02
【问题描述】:

我需要“获取” Dart 类中的方法。

我该怎么做?

我希望能够调用这些方法。

我可以看一个例子吗?

【问题讨论】:

    标签: dart dart-mirrors


    【解决方案1】:

    这是一个简单的可复制粘贴代码示例:

    import 'dart:mirrors';
    import 'dart:io';
    
    main() {
      var im = reflect(new File('test')); // Retrieve the InstanceMirror of some class instance.
      im.type.methods.values.forEach((MethodMirror method) => print(method.simpleName));
    }
    

    输出是:

    existsSync
    _delete
    exists
    directory
    _getDecodedLines
    readAsTextSync
    readAsBytesSync
    readAsLinesSync
    _directory
    throwIfError
    lastModifiedSync
    readAsLines
    open
    _ensureFileService
    deleteSync
    delete
    _exists
    length
    openInputStream
    create
    _create
    readAsText
    _openStdioSync
    openOutputStream
    _fullPath
    _lastModified
    fullPathSync
    readAsBytes
    lastModified
    _openStdio
    _open
    openSync
    lengthSync
    directorySync
    fullPath
    createSync
    _lengthFromName
    

    【讨论】:

    • ClassMirror 不再包含“方法”属性。它现在有“instanceMembers”和“declarations”。 'instanceMembers' 是否与旧的 'methods' 属性同义?
    【解决方案2】:

    这是一个基本的例子:

    (注意:您将需要一个(非常)最新版本的 SDK,这是在 Dart Editor 版本 0.2.1_r14167、Dart SDK 版本 0.2.1.2_r14167 2012 年 11 月 2 日完成的)

    非常感谢 Google Dart 团队的 Gilad 提供了这个示例!

    #import('dart:mirrors');
    
    class MyClass {
      String _test;
    
      String  get test       => _test;
      set     test(String paramVal)  => _test = paramVal;
    
      void my_method() {
      }
    
      void print_test(){
        print("test string is: ${_test}");
      }
    
      MyClass(String test) {
        _test = test;
      }
    
    }
    
    
    main() {
    
      MyClass myClass = new MyClass("Make my day, PUNK.");
    
      myClass.print_test();
    
      //ClassMirror myClassMirror = reflect(myClass).type;
    
      InstanceMirror myClassInstanceMirror = reflect(myClass);
    
      ClassMirror MyClassMirror = myClassInstanceMirror.type;
    
      Map<String, MethodMirror> map = MyClassMirror.methods;
    
      print("map = ${map}"); 
    
      map.values.forEach( (MethodMirror mm){
        myClassInstanceMirror.invoke(mm.simpleName,[]);
      });
    
    }
    

    【讨论】:

      【解决方案3】:

      关于反射,我刚刚编写了几个“帮助函数”,用于获取方法名称的列表(不是 Map)并调用该方法……我可以肯定地说它现在可以工作。不这样做可能有技术原因 - 但在我的情况下,这不会在复杂的环境中运行。但是,我确实认为它们很好地掩盖了并非每个人都想要处理的许多细节。

      这是一个使用和不使用 Helper 函数的功能演示:

      #import('dart:mirrors');
      
      class MyClass {
        String _test;
        String  get test               => _test;
        set     test(String paramVal)  => _test = paramVal;
        void my_method1(){print("in method1");}
        void my_method2(){print("in method2");}
        void print_test(){
          print("test string is: ${_test}");
        }
        MyClass(String test) {
          _test = test;
        }
      }
      
      //Helper Methods
      InstanceMirror hMr;
      List REFLECT_methods(Object myClass) {hMr=reflect(myClass);return(hMr.type.methods.values);}
      REFLECT_invoke(MethodMirror mm){hMr.invoke(mm.simpleName, []);}
      
      main() {
      
        MyClass myClass = new MyClass("Make my day, PUNK.");
      
        print("\n=======Using Raw Reflection================");
        InstanceMirror myClassInstanceMirror = reflect(myClass);
        ClassMirror MyClassMirror = myClassInstanceMirror.type;
        Map<String, MethodMirror> map1 = MyClassMirror.methods;
        map1.values.forEach( (MethodMirror mm){
          myClassInstanceMirror.invoke(mm.simpleName,[]);
        });
      
        print("\n==========Using Helper functions=============");
        List list2 = REFLECT_methods(myClass);
        list2.forEach((method){
          REFLECT_invoke(method);
        });  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        相关资源
        最近更新 更多