Чтение всех классов в пакете или чтение классов с одинаковыми метаданными в Actionscript 3.0 - PullRequest
5 голосов
/ 19 июня 2011

Я делаю проект Actionscript 3.0, который включает в себя самоанализ. Мне интересно, есть ли способ получить все классы в рамках данной структуры пакета. Например, Скажем, есть три класса as3: com.example.test.classOne com.example.test.classTwo com.example.test.classThree

Я хочу иметь возможность сказать

  getClassesUnderPackageName("com.example.test"); 

и возвращайся

  "com.example.test::classOne"
  "com.example.test::classTwo"
  "com.example.test::classThree". 

Есть ли способ сделать это?

Если это невозможно, есть ли способ прочитать классы с одинаковыми метаданными?

например. Если все упомянутые классы имеют одинаковые метаданные [MetadataName (type = "example")], есть ли способ сказать

   getClassesWithSameMetadata("MetadataName");

и возвращайся

   "com.example.test::classOne"
   "com.example.test::classTwo"
   "com.example.test::classThree". 

Спасибо.

Ответы [ 3 ]

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

Нет встроенного механизма для поиска классов, не зная имени класса. (

Однако, если вы загружаете SWF-файл как ByteArray, то можно перебирать классы в нем.

Это может быть излишним для того, что вы хотите.

http://www.bytearray.org/?p=175

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

Посмотрите на AS3 Commons Bytecode .Это позволяет делать отражение на основе байт-кода .Вы можете перечислить все классы (вам нужно будет отфильтровать их, если вы просто хотите определенный пакет), перечислить классы с определенными метаданными или классы, которые реализуют определенный интерфейс.

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

вы можете использовать flash.utils.describeType для возврата XML-данных, содержащих эту информацию.он работает по-разному для базовых классов, как flash.display.Sprite, но для пользовательских классов / каталогов вы можете написать что-то вроде этого:

package branchA.branchB.branchC
{
//Imports
import flash.utils.describeType;

//Class
public class Test
    {
    //Constructor
    public function Test()
        {
        trace(describeType(this).@name);
        }
    }
}

//OUTPUT:  branchA.branchB.branchC::Test

, если вы хотите вернуть базовый класс, вы можете написать что-то вроде этого:

package
{
//Imports
import flash.display.Sprite;
import flash.utils.describeType;

//Class
public class Test extends Sprite
    {
    //Constructor
    public function Test()
        {
        trace(describeType(this).@base);
        }
    }
}

//OUTPUT:  flash.display::Sprite

есть много другой полезной информации, которую вы можете получить, анализируя возвращенные XML-данные descriptionType.


Обновление:

Объекты класса не должны быть сначала созданы для того, чтобы получить их информацию с помощью descriptionType ().Вы можете создать общедоступную статическую функцию (или любую другую), которая принимает массив объектов вашего класса и возвращает массив строк, содержащих требуемые данные descriptionType.

примерно так:

package
{
import flash.utils.describeType;

final public class Describe
    {
    public static function packageNames(classObjects:Array):Vector.<String>
        {
        var names:Vector.<String> = new Vector.<String>();

        for each    (var classObject in classObjects)
                    names.push(describeType(classObject.@name.toString()));

        return names;
        }
    }
}

затем из любой точки вашей программы вы можете передать массив всех классов следующим образом:

var names:Vector.<String> = Describe.packageNames(new Array(classOne, classTwo, classThree));
trace(names);

//Output:
//com.example.test::classOne
//com.example.test::classTwo
//com.example.test::classThree
...