2013-01-09 17 views
8

से कक्षा को इंस्टेंट करें, डार्ट में एक स्ट्रिंग से कक्षा को तुरंत चालू करना संभव है?एक स्ट्रिंग

उदाहरण के लिए:

  • जावास्क्रिप्ट में वेनिला:
var myObject = window[classNameString]; 
  • ऑब्जेक्टिव-सी:
id myclass = [[NSClassFromString(@"MyClass") alloc] init]; 

उत्तर

3

आप पुस्तकालय नाम और वर्ग पता करने की जरूरतचीजों को ठीक से काम करने के लिए नाम। मान लें कि आप दोनों जानते हैं, नीचे दिया गया उदाहरण को तुरंत चालू करेगा और doStuff पर कॉल करेगा।

library test; 

import "dart:mirrors"; 

class TestClass { 
    doStuff() => print("doStuff was called!"); 
} 

main() { 
    MirrorSystem mirrors = currentMirrorSystem(); 
    LibraryMirror lm = mirrors.libraries['test']; 
    ClassMirror cm = lm.classes['TestClass']; 
    Future tcFuture = cm.newInstance('', []); 
    tcFuture.then((InstanceMirror im) { 
    var tc = im.reflectee; 
    tc.doStuff(); 
    }); 
} 

इस समाधान के बारे में कुछ नोट:

  1. पुस्तकालय test हम से पहले से ही वी एम, जो इस मामले में थोड़ा आसान बना देता है में आयात किया जाता है वर्ग लोड करने के लिए कोशिश कर रहे हैं।
  2. कॉल newInstance कन्स्ट्रक्टर को पैरामीटर पास करने की अनुमति देता है। स्थितित्मक तर्क लागू किए जाते हैं, लेकिन नामित पैरामीटर अभी तक लागू नहीं किए गए हैं (एम 2 रिलीज के रूप में)।
  3. newInstanceFuture देता है ताकि इसे isolates पर काम करने की अनुमति मिल सके।
+0

'newInstance' 'भविष्य' वापस नहीं करता है क्योंकि कक्षा को तुरंत चालू करने के लिए एसिंक ऑपरेशन की आवश्यकता हो सकती है, यह सच नहीं है, सबकुछ पहले ही लोड हो चुका है। यह एक 'भविष्य' देता है क्योंकि मिरर एपीआई जानबूझकर असीमित है, क्योंकि यह भविष्य में अलग-अलग काम करेगा (और पार-पृथक संचार हमेशा असीमित होता है)। यदि आप सावधानी से 'नया प्रवेश' आमंत्रण (और 'get/setField' या' invoke' 'जैसे अन्य लोगों का सावधानीपूर्वक निरीक्षण करते हैं, तो आप ध्यान देंगे कि हुड के तहत, यह सिंक्रनाइज़ रूप से काम करता है। यह भविष्य में स्पष्ट रूप से बदल सकता है। – Ladicek

+0

धन्यवाद Ladicek। मैंने जवाब अपडेट कर लिया है। – Kyrra

+0

नोट: जावास्क्रिप्ट में संकलित होने पर यह काम नहीं कर सकता है। डार्ट 2 जेएस कंपाइलर अभी तक मिरर का पूरी तरह से समर्थन नहीं करता है। –

4

वाक्यविन्यास बदल गया है। मैं इस तरह से

library test; 

import "dart:mirrors"; 

class TestClass { 
    doStuff() => print("doStuff was called!"); 
} 

main() { 
    MirrorSystem mirrors = currentMirrorSystem(); 
    LibraryMirror lm = mirrors.libraries.values.firstWhere(
     (LibraryMirror lm) => lm.qualifiedName == new Symbol('test')); 

    ClassMirror cm = lm.declarations[new Symbol('TestClass')]; 

    InstanceMirror im = cm.newInstance(new Symbol(''), []); 
    var tc = im.reflectee; 
    tc.doStuff(); 
} 

काम कर रहे हैं और अधिक 'परीक्षण' नाम पुस्तकालयों हालांकि इस असफल हो जायेगी हैं समझ में आ गया।

+0

दरअसल, 'कक्षाओं के गेटर को' घोषणाओं 'में बदल दिया गया है। – snitko