Class ReflectionLibrary

All Implemented Interfaces:
NodeInterface, Cloneable

public abstract class ReflectionLibrary extends Library
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 first resolving 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
  • 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