Class ReflectionLibrary
java.lang.Object
com.oracle.truffle.api.nodes.Node
com.oracle.truffle.api.library.Library
com.oracle.truffle.api.library.ReflectionLibrary
- All Implemented Interfaces:
NodeInterface, Cloneable
The reflection library allows to send to and proxy messages of receivers. The reflection library
may be used for any receiver object. If a sent message is not implemented by the target receiver
then the default library export will be used, otherwise it is forwarded to the resolved exported
message. If the reflection library is exported by a receiver directly then the reflection
behavior can be customized. This allows, for example, to proxy all messages to a delegate
instance.
Sending Messages
Messages can be sent to receivers by firstresolving
a
target message. Then the message can be sent to a receiver that may implement that message. The
message name and class may be resolved dynamically.
Usage example
String messageName = "isArray"; Message message = Message.resolve(ArrayLibrary.class, messageName); Object receiver = 42; try { ReflectionLibrary.getFactory().getUncached().send(receiver, message); } catch (Exception e) { // handle error }
Proxies
It is possible to proxy library messages to a delegate object. To achieve that the reflection library can be exported by a receiver type.Usage example
@ExportLibrary(ReflectionLibrary.class) static class AgnosticWrapper { final Object delegate; AgnosticWrapper(Object delegate) { this.delegate = delegate; } @ExportMessage final Object send(Message message, Object[] args, @CachedLibrary("this.delegate") ReflectionLibrary reflection) throws Exception { // do before Object result = reflection.send(delegate, message, args); // do after return result; } }
- Since:
- 19.0
-
Nested Class Summary
Nested classes/interfaces inherited from class Node
Node.Child, Node.Children
Modifier and TypeClassDescriptionstatic @interface
Marks fields that represent child nodes of this node.static @interface
Marks array fields that are children of this node. -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
Constructor for generated subclasses. -
Method Summary
Modifier and TypeMethodDescriptionstatic LibraryFactory
<ReflectionLibrary> Returns the library factory forReflectionLibrary
.static ReflectionLibrary
Returns the uncached automatically dispatched version of the reflection library.static ReflectionLibrary
Returns the uncached manually dispatched version of the reflection library.Sends a given message to the target receiver with the provided arguments.Methods inherited from class Node
accept, adoptChildren, atomic, atomic, copy, deepCopy, getChildren, getCost, getDebugProperties, getDescription, getEncapsulatingSourceSection, getLock, getParent, getRootNode, getSourceSection, insert, insert, isAdoptable, isSafelyReplaceableBy, notifyInserted, onReplace, replace, replace, reportPolymorphicSpecialize, reportReplace, toString
Modifier and TypeMethodDescriptionfinal void
accept
(NodeVisitor nodeVisitor) Invokes theNodeVisitor.visit(Node)
method for this node and recursively also for all child nodes.final void
final void
final <T> T
copy()
Creates a shallow copy of this node.deepCopy()
Creates a deep copy of this node.Iterator over the children of this node.getCost()
Deprecated.in 24.1 without replacementReturns properties of this node interesting for debugging and can be overwritten by subclasses to add their own custom properties.Returns a user-readable description of the purpose of the Node, or "" if no description is available.Retrieves the segment of guest language source code that is represented by this Node, if present; otherwise retrieves the segment represented by the nearest AST ancestor that has this information.protected final Lock
getLock()
Returns a lock object that can be used to synchronize modifications to the AST.final Node
The current parent node of this node.final RootNode
Get the root node of the tree a node belongs to.Retrieves the segment of guest language source code that is represented by this Node.final <T extends Node>
Tinsert
(T newChild) final <T extends Node>
T[]insert
(T[] newChildren) boolean
Returnstrue
if this node can be adopted by a parent.final boolean
isSafelyReplaceableBy
(Node newNode) Checks if this node can be replaced by another node: tree structure & type.protected final void
notifyInserted
(Node node) Notifies the framework about the insertion of one or more nodes during execution.protected void
onReplace
(Node newNode, CharSequence reason) Intended to be implemented by subclasses ofNode
to receive a notification when the node is rewritten.final <T extends Node>
Treplace
(T newNode) Replaces this node with another node.final <T extends Node>
Treplace
(T newNode, CharSequence reason) Replaces this node with another node.final void
Notifies the runtime that this node specialized to a polymorphic state.protected final void
reportReplace
(Node oldNode, Node newNode, CharSequence reason) Reports thatoldNode
was replaced withnewNode
, notifying anyreplace observers
and invalidating any compiled call targets.toString()
Converts this node to a textual representation useful for debugging.
-
Constructor Details
-
ReflectionLibrary
protected ReflectionLibrary()Constructor for generated subclasses. Subclasses of this class are generated, do not extend this class directly.- Since:
- 19.0
-
-
Method Details
-
send
Sends a given message to the target receiver with the provided arguments. The provided receiver and message must not be null. If the argument types don't match the expected message signature then anIllegalArgumentException
will be thrown.- Throws:
Exception
- Since:
- 19.0
-
getFactory
Returns the library factory forReflectionLibrary
.- Since:
- 19.0
-
getUncached
Returns the uncached automatically dispatched version of the reflection library. This is a short-cut for callingReflectionLibrary.getFactory().getUncached()
.- Since:
- 21.3
- See Also:
-
getUncached
Returns the uncached manually dispatched version of the reflection library. This is a short-cut for callingReflectionLibrary.getFactory().getUncached(v)
.- Since:
- 21.3
- See Also:
-