Отражение класса от статического метода - PullRequest
1 голос
/ 16 декабря 2010

Я использую отличные библиотеки org.as3commons.reflect и org.as3commons.lang и столкнулся с проблемой. У меня есть статический метод в одном из моих классов, который должен отразить его класс. В библиотеке отражений есть статический метод Type.forClass (clazz: Class), для которого явно требуется переменная Class. В статических методах / коде не разрешено ключевое слово this , поэтому теперь мне нужно узнать, есть ли способ получить класс, для которого вызывается мой статический метод.

Мне нужно что-то, что будет работать в неотладочной версии Flash Player, поэтому любые трюки Error.getStackTrace () не будут работать. Жаль, что в обычной виртуальной машине нет трассировки стека.

import org.as3commons.lang.ClassUtils;
import org.as3commons.reflect.Type;

protected static function doReflection(): void
{
  var aClass: Class = ClassUtils.forInstance(this); // this not allowed in static methods
  var ct: Type = Type.forClass(aClass);
  // do stuff with type
}

Я отказался от поиска в Google и других сайтах; всегда заканчивали тем, что получали учебники и советы по всем вопросам, связанным со статическими элементами, проблемами производительности, всем , кроме того, что я ищу.

В целом, я хочу кэшировать кучу вещей о классе в статических членах, чтобы сохранить ненужную работу каждый раз, когда создается экземпляр класса.

Буду признателен за любую помощь.

Ответы [ 4 ]

1 голос
/ 15 июня 2011

Я думаю, что в режиме отладки вы можете использовать трассировку стека объекта ошибки, чтобы извлечь / отразить класс из статического контекста, но в сборке выпуска вы должны получить глобальную область действия, чтобы отразить:

1 голос
/ 16 декабря 2010

Это может работать не во всех ситуациях ... в основном будет зависеть от того, что происходит с вашим конструктором.

import org.as3commons.lang.ClassUtils;
import org.as3commons.reflect.Type;

static private const CLASS:Object = new YourReflectedClass;

protected static function doReflection(): void {

 // var aClass: Class = ClassUtils.forInstance(this); // this not allowed in static methods

  var aClass:Class = CLASS.constructor;

  var ct: Type = Type.forClass(aClass);
  // do stuff with type
}

Лучше было бы использовать:

static private const CLASS:Class = YourReflectedClass;
var ct: Type = Type.forClass(CLASS);

Просто хотел показать вам метод Object.constructor ...

1 голос
/ 16 декабря 2010

как насчет передачи ссылки на экземпляр, который вам нужен, в качестве аргумента статического метода?

0 голосов
/ 17 декабря 2010

Что по этому поводу:

protected static function doReflection(): void
{
    var aClass: Class = ClassThatYouAreIn as Class; 
    var ct: Type = Type.forClass(aClass);
    // do stuff with type
}

как статические методы даже не наследуются ...

Редактировать: ОК, я только что увидел, что это уже было предложено ...

...