Interface ReflectiveVisitDispatcher<R extends ReflectiveVisitor,E>

Type Parameters:
R - Return type
E - Argument type

public interface ReflectiveVisitDispatcher<R extends ReflectiveVisitor,E>
Interface for looking up methods relating to reflective visitation. One possible implementation would cache the results.

Type parameter 'R' is the base class of visitoR class; type parameter 'E' is the base class of visiteE class.

TODO: obsolete ReflectUtil.lookupVisitMethod(java.lang.Class<?>, java.lang.Class<?>, java.lang.String), and use caching in implementing that method.

  • Method Details

    • lookupVisitMethod

      @Nullable Method lookupVisitMethod(Class<? extends R> visitorClass, Class<? extends E> visiteeClass, String visitMethodName, List<Class> additionalParameterTypes)
      Looks up a visit method taking additional parameters beyond the overloaded visitee type.
      Parameters:
      visitorClass - class of object whose visit method is to be invoked
      visiteeClass - class of object to be passed as a parameter to the visit method
      visitMethodName - name of visit method
      additionalParameterTypes - list of additional parameter types
      Returns:
      method found, or null if none found
    • lookupVisitMethod

      @Nullable Method lookupVisitMethod(Class<? extends R> visitorClass, Class<? extends E> visiteeClass, String visitMethodName)
      Looks up a visit method.
      Parameters:
      visitorClass - class of object whose visit method is to be invoked
      visiteeClass - class of object to be passed as a parameter to the visit method
      visitMethodName - name of visit method
      Returns:
      method found, or null if none found
    • invokeVisitor

      boolean invokeVisitor(R visitor, E visitee, String visitMethodName)
      Implements the Glossary.VISITOR_PATTERN via reflection. The basic technique is taken from a Javaworld article. For an example of how to use it, see ReflectVisitorTest.

      Visit method lookup follows the same rules as if compile-time resolution for VisitorClass.visit(VisiteeClass) were performed. An ambiguous match due to multiple interface inheritance results in an IllegalArgumentException. A non-match is indicated by returning false.

      Parameters:
      visitor - object whose visit method is to be invoked
      visitee - object to be passed as a parameter to the visit method
      visitMethodName - name of visit method, e.g. "visit"
      Returns:
      true if a matching visit method was found and invoked