In computing, type introspection is the ability of a program to examine the type or properties of an object at runtime. Some programming languages possess this capability.
Introspection should not be confused with reflection, which goes a step further and is the ability for a program to manipulate the values, meta-data, properties and/or functions of an object at runtime. Some programming languages - e.g. Java, Python and Go - also possess that capability.
Examples
Ruby
Type introspection is a core feature of Ruby. In Ruby, the Object class (ancestor of every class) provides Object#instance_of? and Object#kind_of? methods for checking the instance's class. The latter returns true when the particular instance the message was sent to is an instance of a descendant of the class in question. For example, consider the following example code (you can immediately try this with the Interactive Ruby Shell):
In the example above, the Class class is used as any other class in Ruby. Two classes are created, A and B, the former is being a superclass of the latter, then one instance of each class is checked. The last expression gives true because A is a superclass of the class of b.
Further, you can directly ask for the class of any object, and "compare" them (code below assumes having executed the code above):
Objective-C
In Objective-C, for example, both the generic Object and NSObject (in Cocoa/OpenStep) provide the method isMemberOfClass: which returns true if the argument to the method is an instance of the specified class. The method isKindOfClass: analogously returns true if the argument inherits from the specified class.
For example, say we have an Apple and Orange class inheriting from Fruit.
Now, in the eat method we can write
Now, when eat is called with a generic object (an id), the function will behave correctly depending on the type of the generic object.
C++
C++ supports type introspection via the run-time type information (RTTI) typeid and dynamic_cast keywords.
The dynamic_cast expression can be used to determine whether a particular object is of a particular derived class. For instance:
The typeid operator retrieves a std::type_info object describing the most derived type of an object:
Object Pascal
Type introspection has been a part of Object Pascal since the original release of Delphi, which uses RTTI heavily for visual form design. In Object Pascal, all classes descend from the base TObject class, which implements basic RTTI functionality. Every class's name can be referenced in code for RTTI purposes; the class name identifier is implemented as a pointer to the class's metadata, which can be declared and used as a variable of type TClass.
The language includes an is operator, to determine if an object is or descends from a given class, an as operator, providing a type-checked typecast, and several TObject methods. More deeper introspection (enumerating fields and methods) are traditionally only supported for objects declared in the $M+ (a pragma) state, typically TPersistent, and only for symbols defined in the published section. Delphi 2010 increased this to nearly all symbols.
Java
The simplest example of type introspection in Java is the instanceof[1] operator. The instanceof operator determines whether a particular object belongs to a particular class (or a subclass of that class, or a class that implements that interface). For instance:
The java.lang.Class[2] class is the basis of more advanced introspection.
For instance, if it is desirable to determine the actual class of an object (rather than whether it is a member of a particular class), Object.getClass() and Class.getName() can be used:
PHP
In PHP introspection can be done using instanceof operator. For instance:
Perl
Introspection can be achieved using the ref and isa functions in Perl.
We can introspect the following classes and their corresponding instances:
using:
Meta-Object Protocol
Much more powerful introspection in Perl can be achieved using the Moose object system[3] and the Class::MOP meta-object protocol,[4] for example this is how you can check if a given object does a role X:
This is how you can list fully qualified names of all of the methods that can be invoked on the object, together with the classes in which they were defined:
Python
The most common method of introspection in Python is using the dir function to detail the attributes of an object. For example:
Also, the built-in functions type and isinstance can be used to determine what an object is while hasattr can determine what an object does. For example:
In Python 2 but not Python 3, declaring class Foo instead of class Foo(object) will result in type returning the generic instance type instead of the class.[5]
ActionScript (as3)
In ActionScript the function flash.utils.getQualifiedClassName can be used to retrieve the Class/Type name of an arbitrary Object.
Or alternatively in actionscipt the operator is can be used to determine if an object is of a specific type
This second function can be used to test class inheritance parents as well
Meta-Type introspection
Like perl, actionscript can go further than getting the Class Name, but all the metadata, functions and other elements that make up an object using the flash.utils.describeType function, this is used when implementing reflection in actionscript.
See also
Reflection (computer science)
Reification (computer science)
References
1. ^Java Language Specification: instanceof 2. ^Java API: java.lang.Class 3. ^[https://metacpan.org/module/Moose::Manual::MOP Moose meta API documentation] 4. ^[https://metacpan.org/module/Class::MOP Class::MOP - a meta-object protocol for Perl] 5. ^[https://www.python.org/download/releases/2.2/descrintro/ Unifying types and classes in Python 2.2]