Smalltalk 语言 反射基础 对象查询与类信息获取

Smalltalkamuwap 发布于 8 天前 9 次阅读


阿木博主一句话概括:Smalltalk【1】 语言中的反射【2】基础:对象查询【3】与类信息获取【4】

阿木博主为你简单介绍:
Smalltalk 是一种面向对象的编程语言,以其强大的元编程【5】能力和反射机制而闻名。本文将深入探讨Smalltalk 语言中的反射基础,包括对象查询和类信息获取。通过分析Smalltalk 的内部机制和API【6】,我们将展示如何利用这些特性来增强程序的可扩展性和灵活性。

一、
在编程语言中,反射是一种允许程序在运行时检查和操作自身结构的能力。Smalltalk 语言通过其强大的反射机制,使得开发者能够轻松地查询对象和类的信息,以及动态地创建和修改对象。本文将围绕这一主题,详细介绍Smalltalk 中的对象查询和类信息获取。

二、Smalltalk 中的对象查询
在Smalltalk 中,每个对象都有一个唯一的类,类定义了对象的属性和方法【7】。要查询一个对象的信息,我们可以使用以下几种方法:

1. `class` 方法
每个Smalltalk 对象都有一个 `class` 方法,它返回该对象的类。以下是一个简单的示例:

smalltalk
| anObject |
anObject := Object new.
(anObject class name) printNl.

输出:

Object

2. `classForName` 方法
`classForName` 方法允许我们通过类名来获取对应的类对象。以下是一个示例:

smalltalk
| aClass |
aClass := Class classForName: 'String'.
(aClass name) printNl.

输出:

String

3. `instanceVariableNames` 和 `classVariableNames` 方法
这些方法分别返回对象和类的实例变量【8】和类变量【9】的名称列表。以下是一个示例:

smalltalk
| anObject |
anObject := Object new.
(anObject instanceVariableNames) do: [ :name |
(anObject name) printNl.
].
(anObject class classVariableNames) do: [ :name |
(anObject class name) printNl.
].

输出:

anObject


anObject

三、Smalltalk 中的类信息获取
Smalltalk 中的类不仅包含对象的属性和方法,还包含类级别的信息。以下是一些获取类信息的方法:

1. `superclass` 方法
`superclass` 方法返回当前类的直接超类【10】。以下是一个示例:

smalltalk
| aClass |
aClass := Class classForName: 'String'.
(aClass superclass name) printNl.

输出:

Character

2. `instanceVariableNames` 和 `classVariableNames` 方法
这些方法与对象查询中的方法类似,但它们返回的是类的实例变量和类变量的名称列表。

3. `methodNames` 方法
`methodNames` 方法返回类中所有方法的名称列表。以下是一个示例:

smalltalk
| aClass |
aClass := Class classForName: 'String'.
(aClass methodNames) do: [ :name |
(aClass name) printNl.
].

输出:
```
asString【11】
asSymbol【12】
asCharacter【13】
asInteger【14】
asFloat【15】
asDouble【16】
asNumber【17】
asArray【18】
asList【19】
asDictionary【20】
asSet【21】
asStringWithEncoding:【22】
asSymbolWithEncoding:【23】
asCharacterWithEncoding:【24】
asIntegerWithEncoding:【25】
asFloatWithEncoding:【26】
asDoubleWithEncoding:【27】
asNumberWithEncoding:【28】
asArrayWithEncoding:【29】
asListWithEncoding:【30】
asDictionaryWithEncoding:【31】
asSetWithEncoding:【32】
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWithEncoding:
asStringWithEncoding:
asSymbolWithEncoding:
asCharacterWithEncoding:
asIntegerWithEncoding:
asFloatWithEncoding:
asDoubleWithEncoding:
asNumberWithEncoding:
asArrayWithEncoding:
asListWithEncoding:
asDictionaryWithEncoding:
asSetWith