Class ReflectUtil

java.lang.Object
org.apache.calcite.util.ReflectUtil

public abstract class ReflectUtil extends Object
Static utilities for Java reflection.
  • Constructor Details

    • ReflectUtil

      public ReflectUtil()
  • Method Details

    • getByteBufferReadMethod

      public static Method getByteBufferReadMethod(Class clazz)
      Uses reflection to find the correct java.nio.ByteBuffer "absolute get" method for a given primitive type.
      Parameters:
      clazz - the Class object representing the primitive type
      Returns:
      corresponding method
    • getByteBufferWriteMethod

      public static Method getByteBufferWriteMethod(Class clazz)
      Uses reflection to find the correct java.nio.ByteBuffer "absolute put" method for a given primitive type.
      Parameters:
      clazz - the Class object representing the primitive type
      Returns:
      corresponding method
    • getBoxingClass

      public static Class getBoxingClass(Class primitiveClass)
      Gets the Java boxing class for a primitive class.
      Parameters:
      primitiveClass - representative class for primitive (e.g. java.lang.Integer.TYPE)
      Returns:
      corresponding boxing Class (e.g. java.lang.Integer)
    • getUnqualifiedClassName

      public static String getUnqualifiedClassName(Class c)
      Gets the name of a class with no package qualifiers; if it's an inner class, it will still be qualified by the containing class (X$Y).
      Parameters:
      c - the class of interest
      Returns:
      the unqualified name
    • getUnmangledMethodName

      public static String getUnmangledMethodName(Class declaringClass, String methodName, Class[] paramTypes)
      Composes a string representing a human-readable method name (with neither exception nor return type information).
      Parameters:
      declaringClass - class on which method is defined
      methodName - simple name of method without signature
      paramTypes - method parameter types
      Returns:
      unmangled method name
    • getUnmangledMethodName

      public static String getUnmangledMethodName(Method method)
      Composes a string representing a human-readable method name (with neither exception nor return type information).
      Parameters:
      method - method whose name is to be generated
      Returns:
      unmangled method name
    • invokeVisitor

      public static boolean invokeVisitor(ReflectiveVisitor visitor, Object visitee, Class hierarchyRoot, 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
      hierarchyRoot - if non-null, visitor method will only be invoked if it takes a parameter whose type is a subtype of hierarchyRoot
      visitMethodName - name of visit method, e.g. "visit"
      Returns:
      true if a matching visit method was found and invoked
    • lookupVisitMethod

      public static @Nullable Method lookupVisitMethod(Class<?> visitorClass, Class<?> 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
    • lookupVisitMethod

      public static @Nullable Method lookupVisitMethod(Class<?> visitorClass, Class<?> 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
      See Also:
    • createDispatcher

      public static <R extends ReflectiveVisitor, E> ReflectiveVisitDispatcher<R,E> createDispatcher(Class<R> visitorBaseClazz, Class<E> visiteeBaseClazz)
      Creates a dispatcher for calls to lookupVisitMethod(java.lang.Class<?>, java.lang.Class<?>, java.lang.String). The dispatcher caches methods between invocations.
      Parameters:
      visitorBaseClazz - Visitor base class
      visiteeBaseClazz - Visitee base class
      Returns:
      cache of methods
    • createMethodDispatcher

      public static <E, T> ReflectUtil.MethodDispatcher<T> createMethodDispatcher(Class<T> returnClazz, ReflectiveVisitor visitor, String methodName, Class<E> arg0Clazz, Class... otherArgClasses)
      Creates a dispatcher for calls to a single multi-method on a particular object.

      Calls to that multi-method are resolved by looking for a method on the runtime type of that object, with the required name, and with the correct type or a subclass for the first argument, and precisely the same types for other arguments.

      For instance, a dispatcher created for the method

      String foo(Vehicle, int, List)

      could be used to call the methods

      String foo(Car, int, List)
      String foo(Bus, int, List)

      (because Car and Bus are subclasses of Vehicle, and they occur in the polymorphic first argument) but not the method

      String foo(Car, int, ArrayList)

      (only the first argument is polymorphic).

      You must create an implementation of the method for the base class. Otherwise throws IllegalArgumentException.

      Parameters:
      returnClazz - Return type of method
      visitor - Object on which to invoke the method
      methodName - Name of method
      arg0Clazz - Base type of argument zero
      otherArgClasses - Types of remaining arguments
    • getParameterName

      public static String getParameterName(Method method, int i)
      Derives the name of the ith parameter of a method.
    • isParameterOptional

      public static boolean isParameterOptional(Method method, int i)
      Derives whether the ith parameter of a method is optional.
    • mightBeAssignableFrom

      public static boolean mightBeAssignableFrom(Class<?> parameterType, Class<?> argumentType)
      Returns whether a parameter of a given type could possibly have an argument of a given type.

      For example, consider method

      foo(Object o, String s, int i, Number n, BigDecimal d

      To which of those parameters could I pass a value that is an instance of HashMap? The answer:

      • o yes,
      • s no (String is a final class),
      • i no,
      • n yes (Number is an interface, and HashMap is a non-final class, so I could create a sub-class of HashMap that implements Number,
      • d yes (BigDecimal is a non-final class).
    • isPublic

      public static boolean isPublic(Member member)
      Returns whether a member (constructor, method or field) is public.
    • isStatic

      public static boolean isStatic(Member member)
      Returns whether a member (constructor, method or field) is static.