是否有以下反射语言功能的名称和标准实现方式?

1.2*_*tts 3 javascript c java syntax actionscript-3

假设您有一个对象,并且想要获取要引用的属性的名称字符串.那有名字吗?我的意思是它的某种形式,reflection但它是否有更具体的名称,语言是否以标准方式实现?

例如,此功能适用toString()于在JavaScript或ActionScript中使用的基于类的对象.

var person:Person = new Person();
var nameOfClass:String = person.toString();
trace(nameOfClass); // traces "Person" or "com.mydomain.model.Person"
Run Code Online (Sandbox Code Playgroud)

但由于属性可以为null或未定义,因此无法使用,toString()因为它会抛出错误,如果不是null,它将获得value:

var person:Person = new Person();
var nameOfProperty:String = person.name.toString(); // error is thrown when null
person.name = "John";
person.name.toString(); // traces the value "John" not the type
Run Code Online (Sandbox Code Playgroud)

所以我猜一些语言会有这样的全局函数.

var person:Person = new Person();
var nameOfProperty:String = propertyName(person.name);

trace(nameOfProperty); // traces "name"

nameOfProperty = propertyName(person.zipCode);
trace(person.zipCode); // traces "zipCode" 
Run Code Online (Sandbox Code Playgroud)

是否有此功能的特定名称,如果是,是如何实现的?

ssu*_*ube 5

这称为RTTI,不,没有标准,也没有标准.

每种语言都以不同的方式实现类型(许多语言甚至不会将它们保留到运行时).在C++中,类不知道它们的命名空间.在JS中,原型继承使整个事情变得毫无意义(尽管你可以获取构造函数,它具有自己的名称).

访问实例中的属性时,它甚至更加丑陋.该属性可能是getter/setter,并链接到子对象或具有完全不同名称的字段.

很多语言确实在类级别提供运行时类型信息,但我不知道一种语言具有足够重的属性,以至于它们可以将自己反映出来.知道在父母身上分配位置的每个属性可能是不可能的,因为可以将对象分配给多个变量.查询会返回一系列未完成的引用,但创建该列表会引入更多引用(虽然很弱).

在某些语言中,特别是那些在常规旧代码而不是底层(虚拟)机器中实现垃圾收集的语言,您可能能够查找持有对象的所有智能指针.这通常是智能指针类的实现细节,因此它知道引用的数量或确切位置.

但是,这些功能都不会帮助您处理属性.我认为这主要是因为你可以将它们分配到任何地方,所以它不是很有意义.如果您想要命名属性,请使用Map.;)