如何确定Class对象是否表示actionscript 3.0中的类或接口

时间:2014-03-18 19:14:38

标签: actionscript-3 flash reflection actionscript runtime

我正在尝试在actionscript中开发一个方法,该方法将Class对象作为参数,并在运行时生成该类的实例:

public function getComponent(componentType:Class):Object
{
    return new componentType();
}

在某些情况下,我可能会传递一个代表接口的Class对象。当然,我不能直接创建接口的实例。

有没有办法查询Class对象并确定它是否代表一个接口,以便我可以避免尝试以这种方式创建实例?

3 个答案:

答案 0 :(得分:1)

假设您遵循接口类的命名约定,如标准IInterfaceName,前缀为大写字母的接口名称" I"跟随大写字母和其他类名。有几种方法可以做到这一点。如果你有许多不同的接口可以作为参数传递,你可以这样做:

首先导入flash.utils.getQualifiedClassName并在您的函数中

public function getComponent(componentType:Class):Object
{
    var name:String = getQualifiedClassName( componentType ).replace(/.*\:+/g,"");
    if ( name.search( /^\I[A-Z]/g ) != -1 ) {
        trace( "parameter is an interface!" );
        return null;
    }
    return new componentType();
}

您不必设置名称变量,但这有助于使搜索更加严格。你可以这样做:

if ( getQualifiedClassName( componentType ).search( /\I[A-Z]/g ) != -1 ) {
    trace( "parameter is an interface!" );
    return null;
}

如果您还不知道,getQualifiedClassName将返回类名的字符串格式。正则表达式专门检查大写IInterfaceName样式字符串。

最后,如果您知道它只有一个界面,那么您可以简单地执行此操作:

if ( componentType == IMyinterface ) {
    trace( "component is a IMyinterface" );
}

答案 1 :(得分:1)

经过一番仔细的试验和错误后,我发现了以下功能:

public static function isInterface(clazz:Class):Boolean
{
    return describeType(clazz).factory.extendsClass.(@type=="Object").length()==0;
}

是否有人知道这种情况是否始终适用于所有actionscript接口?

答案 2 :(得分:1)

我认为这对你有用:

getQualifiedSuperclassName(classObject);

如果传递接口,则返回null,因为接口没有超类。它总会给你一个类的任何结果,因为每个类基本上都是一个对象:)

无论如何,我不认为将这样的混合值传递给函数是个好主意;)并且检查类是否以“I”开头是更糟糕的(对不起Bennett :))

P.S。 请记住,describeType非常慢!