blob: 1de039802c96511e0372ebe9ce3d3aa55bd5af90 [file] [log] [blame]
package org.checkerframework.common.reflection;
import com.sun.source.tree.MethodInvocationTree;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
import org.checkerframework.framework.type.AnnotatedTypeFactory;
import org.checkerframework.framework.type.AnnotatedTypeFactory.ParameterizedExecutableType;
/**
* Interface for reflection resolvers that handle reflective method calls such as {@link
* Method#invoke(Object, Object...)} or {@link Constructor#newInstance(Object...)}.
*
* @checker_framework.manual #reflection-resolution Reflection resolution
*/
public interface ReflectionResolver {
/** The "method name" of constructors. */
public static final String INIT = "<init>";
/**
* A list containing just the "method name" of constructors. Clients must not modify this list.
*/
public static final List<String> INIT_LIST = Collections.singletonList(INIT);
/**
* Determines whether the given tree represents a reflective method or constructor call.
*
* @return {@code true} iff tree is a reflective method invocation, {@code false} otherwise
*/
public boolean isReflectiveMethodInvocation(MethodInvocationTree tree);
/**
* Resolve reflection and return the result of {@code factory.methodFromUse} for the actual,
* resolved method or constructor call. If the reflective method cannot be resolved the original
* result ({@code origResult}) is returned.
*
* @param factory the currently used AnnotatedTypeFactory
* @param tree the reflective invocation tree (m.invoke or c.newInstance)
* @param origResult the original result for the unresolved, reflective method call
*/
public ParameterizedExecutableType resolveReflectiveCall(
AnnotatedTypeFactory factory,
MethodInvocationTree tree,
ParameterizedExecutableType origResult);
}