Class ShadowWrangler
- java.lang.Object
-
- org.robolectric.internal.bytecode.ShadowWrangler
-
- All Implemented Interfaces:
ClassHandler
@AutoService(ClassHandler.class) @Priority(-2147483648) public class ShadowWrangler extends Object implements ClassHandler
ShadowWrangler matches shadowed classes up with corresponding shadows based on aShadowMap
.ShadowWrangler has no specific knowledge of Android SDK levels or other peculiarities of the affected classes and shadows.
To apply additional rules about which shadow classes and methods are considered matches, pass in a
ShadowMatcher
.ShadowWrangler is Robolectric's default
ClassHandler
implementation. To inject your own, create a subclass and annotate it withAutoService
(ClassHandler).
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.robolectric.internal.bytecode.ClassHandler
ClassHandler.Plan
-
-
Field Summary
Fields Modifier and Type Field Description static Method
CALL_REAL_CODE
static ClassHandler.Plan
CALL_REAL_CODE_PLAN
static MethodHandle
DO_NOTHING
static Function<Object,Object>
DO_NOTHING_HANDLER
static Method
DO_NOTHING_METHOD
static ClassHandler.Plan
DO_NOTHING_PLAN
-
Constructor Summary
Constructors Constructor Description ShadowWrangler(ShadowMap shadowMap, ShadowMatcher shadowMatcher, Interceptors interceptors)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
classInitializing(Class clazz)
Called by Robolectric when an instrumented class is first loaded into a sandbox and is ready to be statically initialized.MethodHandle
findShadowMethodHandle(Class<?> definingClass, String name, MethodType methodType, boolean isStatic)
Called by Robolectric when an instrumented method is invoked.MethodHandle
getShadowCreator(Class<?> theClass)
Called by Robolectric to determine how to create and initialize a shadow object when a new instance of an instrumented class has been instantiated.Object
initializing(Object instance)
Called by Robolectric when a new instance of an instrumented class has been created and is ready to be initialized (but only on JVMs which don't support theinvokedynamic
instruction).Object
intercept(String signature, Object instance, Object[] params, Class theClass)
Called by Robolectric when an intercepted method is invoked.static Class<?>
loadClass(String paramType, ClassLoader classLoader)
ClassHandler.Plan
methodInvoked(String signature, boolean isStatic, Class<?> theClass)
Called by Robolectric when an instrumented method is invoked.protected Method
pickShadowMethod(Class<?> definingClass, String name, Class<?>[] paramTypes)
<T extends Throwable>
TstripStackTrace(T throwable)
Removes Robolectric noise from stack traces.
-
-
-
Field Detail
-
DO_NOTHING_PLAN
public static final ClassHandler.Plan DO_NOTHING_PLAN
-
CALL_REAL_CODE_PLAN
public static final ClassHandler.Plan CALL_REAL_CODE_PLAN
-
CALL_REAL_CODE
public static final Method CALL_REAL_CODE
-
DO_NOTHING
public static final MethodHandle DO_NOTHING
-
DO_NOTHING_METHOD
public static final Method DO_NOTHING_METHOD
-
-
Constructor Detail
-
ShadowWrangler
public ShadowWrangler(ShadowMap shadowMap, ShadowMatcher shadowMatcher, Interceptors interceptors)
-
-
Method Detail
-
loadClass
public static Class<?> loadClass(String paramType, ClassLoader classLoader)
-
classInitializing
public void classInitializing(Class clazz)
Description copied from interface:ClassHandler
Called by Robolectric when an instrumented class is first loaded into a sandbox and is ready to be statically initialized.This happens *in place of* any static initialization that may be performed by the class being loaded. The class will have a method named
__staticInitializer__
which may be invoked to perform its normal initialization from<clinit>
.- Specified by:
classInitializing
in interfaceClassHandler
- Parameters:
clazz
- the class being loaded
-
initializing
public Object initializing(Object instance)
Description copied from interface:ClassHandler
Called by Robolectric when a new instance of an instrumented class has been created and is ready to be initialized (but only on JVMs which don't support theinvokedynamic
instruction).This happens before constructor code executes on the new instance.
Implementations may return an object which will be associated with the new instance and passed along on future calls to
ClassHandler.methodInvoked(String, boolean, Class)
.- Specified by:
initializing
in interfaceClassHandler
- Parameters:
instance
- the newly-created instance- Returns:
- a data value to be associated with the new instance
- See Also:
for newer JVMs
-
methodInvoked
public ClassHandler.Plan methodInvoked(String signature, boolean isStatic, Class<?> theClass)
Description copied from interface:ClassHandler
Called by Robolectric when an instrumented method is invoked.Implementations should return an
ClassHandler.Plan
, which will be invoked with details about the current instance and parameters.Implementations may also return null, in which case the method's original code will be executed.
- Specified by:
methodInvoked
in interfaceClassHandler
- Parameters:
signature
- the JVM internal-format signature of the method being invoked (e.g.android/view/View/measure(II)V
)isStatic
- true if the method is statictheClass
- the class on which the method is declared- Returns:
- an execution plan, or null if the original method's code should be executed
- See Also:
for newer JVMs
-
findShadowMethodHandle
public MethodHandle findShadowMethodHandle(Class<?> definingClass, String name, MethodType methodType, boolean isStatic) throws IllegalAccessException
Description copied from interface:ClassHandler
Called by Robolectric when an instrumented method is invoked.Implementations should return an
MethodHandle
, which will be invoked with details about the current instance and parameters.Implementations may also return null, in which case the method's original code will be executed.
- Specified by:
findShadowMethodHandle
in interfaceClassHandler
- Parameters:
definingClass
- the class on which the method is declaredname
- the name of the methodmethodType
- the method typeisStatic
- true if the method is static- Returns:
- a method handle to invoke, or null if the original method's code should be executed
- Throws:
IllegalAccessException
- See Also:
for older JVMs
,for invalidating the returned
-
pickShadowMethod
protected Method pickShadowMethod(Class<?> definingClass, String name, Class<?>[] paramTypes)
-
intercept
public Object intercept(String signature, Object instance, Object[] params, Class theClass) throws Throwable
Description copied from interface:ClassHandler
Called by Robolectric when an intercepted method is invoked.Unlike instrumented methods, calls to intercepted methods are modified in place by Robolectric in the calling code. This is useful when the method about to be invoked doesn't exist in the current JVM (e.g. because of Android differences).
- Specified by:
intercept
in interfaceClassHandler
- Parameters:
signature
- the JVM internal-format signature of the method being invoked (e.g.android/view/View/measure(II)V
)instance
- the instance on which the method would have been invokedparams
- the parameters to the methodtheClass
- the class on which the method is declared- Returns:
- the value to be returned
- Throws:
Throwable
- if anything bad happens
-
stripStackTrace
public <T extends Throwable> T stripStackTrace(T throwable)
Description copied from interface:ClassHandler
Removes Robolectric noise from stack traces.- Specified by:
stripStackTrace
in interfaceClassHandler
- Type Parameters:
T
- the type of exception- Parameters:
throwable
- the exception to be stripped- Returns:
- the stripped stack trace
-
getShadowCreator
public MethodHandle getShadowCreator(Class<?> theClass)
Description copied from interface:ClassHandler
Called by Robolectric to determine how to create and initialize a shadow object when a new instance of an instrumented class has been instantiated. (but only on JVMs which support theinvokedynamic
instruction).The returned
MethodHandle
will be invoked after the new object has been allocated but before its constructor code is executed.Note that this is not directly analogous to
ClassHandler.initializing(Object)
; the return value from this method will be cached and used again for other instantiations of instances of the same class.- Specified by:
getShadowCreator
in interfaceClassHandler
- Parameters:
theClass
- the instrumented class- Returns:
- a data value to be associated with the new instance
- See Also:
for older JVMs
,for invalidating the returned
-
-