describeTypeJSON
So it looks like Flash Player 10.1 might support a somewhat improved reflections API containing support for:
- retrieving reflected information as JSON (or rather, as an AS3 object tree)
- filtering the request to only retrieve certain types of information
- Some more functions that are used internally to construct the result of describeType
In other words, it containes improved access to the information available
through describeType and nothing more.
All of this functionality resides in the avmplus package in the
playerglobal.swc that can be downloaded from labs.adobe.com.
This package contains a few methods and an assortment of constants:

The most (or only, really) interesting of these is
DescribeType.describeTypeJSON. Using this method, it’s possible to retrieve
reflection data as an object and to filter certain types of information using
the constants seen in the image above as bit flags. For example, to get only
information about the reflected classes constructor, you use the following
code:
1 2 3 | |
Using the different flags, it’s possible to request an object containing exactly the information needed for a certain use-case. For example, in SwiftSuspenders, I’d use the following code to get information about a types’ methods, getters/setters, variables and constructor, all with associated metadata:
1 2 3 4 5 6 7 8 | |
The last two flags have to be present to get any meaningful information at
all. I honestly have no idea why it’d be necessary to explicitly state that,
yes, I want to include traits - you know, the mechanism with which the virtual
machine links everything to classes and without which a class is completely
uninteresting. And don’t get me started on what avmplus.USE_ITRAITS stands
for.
All of this can also be used with the new avmplus.describeType, which is
essentially identical to flash.utils.describeType except that it adds an
additional parameter for the configuration flags:
1
| |
Detours
If you think that that’s all you need to know about how to use this new API,
think again. All of these methods and the DescribeType class are implemented
as internal types of the avmplus package and thus not accessible from
outside this package. Fortunately, this can be worked around by creating a
public wrapper in the same package:
Is it all just a mistake?
There are some things that are a bit fishy about this whole affair: Why is all
this functionality internal to the avmplus namespace? And what’s with the
name “avmplus” in the first place? Seems like a weird choice to expose the
project name of the VM in such a way. Also, the API feels quite rough and
exposes functionality that’s seemingly useless to AS3 developers.
Investigating some more, I discovered how this entire API came to be: It’s the
new implementation of the old describeType functionality in the new version
of the ActionScript Virtual Machine, code named Tamarin Tracing. The log message of the commit which added it sheds some light on this. Since this initial commit,
a few changes have
been made, resulting in the current version of the API as exposed in 10.1
beta.
Now here’s my guess about what’s happened: When creating the Flash Player
beta, some configuration option was set the wrong way, causing the avmplus
package to be visible within playerglobal.swc, when it really should be an
invisible implementation detail. At the very least, the API in this state
probably isn’t meant for public consumption and might well be removed in the
final 10.1 version.
Now what?
I’d really like for this API to stay - be it in the current state or as a
polished version located in the flash.utils package or wherever.
Unfortunately, I’m not sure what to do to that end; Adding a bug to the Flash
Player issue tracker to ask that something that’s available in the beta should
stay that way in the final release seems odd.