Search code examples
apache-flexactionscriptclassloader

Strange behavior from getDefinitionByName


I've created a class that loads it's subclasses based on a name passed to it. The function uses getDefinitionByName, gets the class type, and instantiates it, and returns it if the class is a subtype of the class that owns this method. The subtypes are all mxml files that extend the base class, in order to simplify instantiating controls.

However, in the case where I pass it a fully qualified name, it works in my unit tests but fails when I execute it in the context of my application. Is there a gotcha in getDefinitionByName that makes it behave differently in different execution contexts? Is there a simpler way to load classes by their qualified name?

static public function loadDisplay(className:String, extendedClassName:String = null):FeatureDisplay
{
    try
    {
        trace("Loading", className);
        var cls:Class = getDefinitionByName(className) as Class;
        var display:FeatureDisplay = new cls() as FeatureDisplay;
        if(display)
        {
            return display;
        }
        else
        {
            trace(className, "is not a subclass of FeatureDisplay");
            return null;
        }
    }
    catch(error:Error)
    {
        trace("Error loading", className);
        trace("Error:", error.message);
    }
    return null;
}

Solution

  • FYI, I've seen the following method of keeping classes used in Flex's source code:

    // References.cs
    
    // notice the double reference: one to import, the other to reference
    import package.to.ClassA; ClassA;
    import package.to.ClassB; ClassB;
    import package.to.ClassC; ClassC;
    

    Of course, you still have to reference the "References" class somewhere.