Using mirrors, how can I get a reference to a class's method?

独自空忆成欢 提交于 2020-01-04 04:56:02

问题


Say I have an instance of a class Foo, and I want to grab a list of all of its methods that are annotated a certain way. I want to have a reference to the method itself, so I'm not looking to use reflection to invoke the method each time, just to grab a reference to it the first time.

In other words, I want to do the reflection equivalent of this:

class Foo {
  a() {print("a");}
}

void main() {
  var f = new Foo();
  var x = f.a; // Need reflective way of doing this
  x(); // prints "a"
}

I have tried using InstanceMirror#getField, but methods are not considered fields so that didn't work. Any ideas?


回答1:


As far as I understand reflection in Dart, there's no way to get the actual method as you wish to. (I'll very happily delete this answer if someone comes along and shows how to do that.)

The best I can come up with to ameliorate some of what you probably don't like about using reflection to invoke the method is this:

import 'dart:mirrors';

class Foo {
  a() {print("a");}
}

void main() {
  var f = new Foo();

  final fMirror = reflect(f);
  final aSym = new Symbol('a');
  final x = () => fMirror.invoke(aSym, []);

  x(); // prints "a"
}

Again, I know that's not quite what you're looking for, but I believe it's as close as you can get.

Side note: getField invokes the getter and returns the result -- it's actually fine if the getter is implemented as a method. It doesn't work for you here, but for a different reason than you thought.




回答2:


What you're trying to get would be described as the "closurized" version of the method. That is, you want to get the method as a function, where the receiver is implicit in the function invocation. There isn't a way to get that from the mirror. You could get a methodMirror as reflect(foo).type.methods[const Symbol("a")] but you can't invoke the result.



来源:https://stackoverflow.com/questions/17395799/using-mirrors-how-can-i-get-a-reference-to-a-classs-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!