私はDartクラスのメソッドを "フェッチ"する必要があります。Reflection(Mirrors)を使用してDartクラスのメソッド名にアクセスするにはどうすればよいですか?
どうすればいいですか?
そして、私はメソッドを呼び出すことができるようにしたい。
例がありますか?ここで
私はDartクラスのメソッドを "フェッチ"する必要があります。Reflection(Mirrors)を使用してDartクラスのメソッド名にアクセスするにはどうすればよいですか?
どうすればいいですか?
そして、私はメソッドを呼び出すことができるようにしたい。
例がありますか?ここで
ここで簡単にコピーpasteableコードサンプルです:
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
は、基本的な例である:
(注意:あなたは(非常に)このためのSDKの最新のバージョンまで、これはダートEditorバージョン0.2.1_r14167で行われていた持っていることになるでしょう、ダートSDKのバージョン0.2.1.2_r14167 2012年11月2日)
この例を提供してくれたGoogleダーツチームの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,[]);
});
}
それは今働く。このようにしないと技術的な理由が考えられますが、私の場合、これは複雑な環境では実行されません。しかし、私は彼らがうまくいけば、誰もが対処したくない細部について隠蔽していると思う。ここで
は、ヘルパー機能を持つとせずに機能するデモです:
#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);
});
}
ClassMirror 'methods'プロパティは含まれなくなりました。今は 'instanceMembers'と '宣言'を持っています。 'instanceMembers'は古い 'methods'プロパティの同義語ですか? – ringstaff