@HashCodeAndEqualsPlugin.Enhance public class MemberSubstitution extends Object implements AsmVisitorWrapper.ForDeclaredMethods.MethodVisitorWrapper
Substitutes field access, method invocations or constructor calls within a method's body.
Note: This substitution must not be used to match constructor calls to an instrumented class's super constructor invocation from within a constructor. Matching such constructors will result in an invalid stack and a verification error.
Note: This visitor will compute the required stack size on a best effort basis. For allocating an optimal stack size, ASM needs to be configured to compute the stack size.
Important: This component relies on using a TypePool
for locating types within method bodies. Within a redefinition
or a rebasement, this type pool normally resolved correctly by Byte Buddy. When subclassing a type, the type pool must be set
explicitly, using DynamicType.Builder.make(TypePool)
or any similar method. It is however not normally
necessary to use this component when subclassing a type where methods are only defined explicitly.
Modifier and Type | Class and Description |
---|---|
static interface |
MemberSubstitution.AllArguments
Assigns an array containing all arguments of the targeted element to the annotated parameter.
|
static interface |
MemberSubstitution.Argument
Indicates that the annotated parameter should be mapped to the parameter with index
MemberSubstitution.Argument.value() . |
static interface |
MemberSubstitution.Current
Indicates that the annotated parameter should be assigned the value of the result that was
yielded by the previous chain expression.
|
static interface |
MemberSubstitution.FieldGetterHandle
Indicates that the annotated parameter should be mapped to a
java.lang.invoke.MethodHandle representing a field getter. |
static interface |
MemberSubstitution.FieldSetterHandle
Indicates that the annotated parameter should be mapped to a
java.lang.invoke.MethodHandle representing a field setter. |
static interface |
MemberSubstitution.FieldValue
Indicates that the annotated parameter should be mapped to a field in the scope of the instrumented type.
|
static interface |
MemberSubstitution.Origin
Indicates that the annotated parameter should be mapped to a representation of the substituted element or
instrumented method.
|
protected static interface |
MemberSubstitution.Replacement
A replacement combines a
MemberSubstitution.Substitution and a way of choosing if this substitution should be applied for a discovered member. |
static interface |
MemberSubstitution.SelfCallHandle
Indicates that the annotated parameter should load a
java.lang.invoke.MethodHandle that represents an invocation of
the substituted expression or instrumented method. |
static class |
MemberSubstitution.Source
Identifies the source of an instruction that might describe a value of the substituted element
or the instrumented method.
|
static interface |
MemberSubstitution.StubValue
Indicates that the annotated parameter should always return a boxed version of the instrumented method's return value
(i.e.
|
protected static class |
MemberSubstitution.SubstitutingMethodVisitor
A method visitor that applies a substitution for matched methods.
|
static interface |
MemberSubstitution.Substitution
A substitution replaces or enhances an interaction with a field or method within an instrumented method.
|
static interface |
MemberSubstitution.This
Indicates that the annotated parameter should be mapped to the
this reference of the substituted field,
method, constructor or of the instrumented method. |
static interface |
MemberSubstitution.TypePoolResolver
A type pool resolver is responsible for resolving a
TypePool for locating substituted members. |
static interface |
MemberSubstitution.Unused
Indicates that the annotated parameter should always return a default value (i.e.
|
static class |
MemberSubstitution.WithoutSpecification
A member substitution that lacks a specification for how to substitute the matched members references within a method body.
|
Modifier and Type | Field and Description |
---|---|
protected static int |
THIS_REFERENCE
The index of the this reference within a non-static method.
|
Modifier | Constructor and Description |
---|---|
protected |
MemberSubstitution(boolean strict)
Creates a default member substitution.
|
protected |
MemberSubstitution(MethodGraph.Compiler methodGraphCompiler,
MemberSubstitution.TypePoolResolver typePoolResolver,
boolean strict,
boolean failIfNoMatch,
MemberSubstitution.Replacement.Factory replacementFactory)
Creates a new member substitution.
|
Modifier and Type | Method and Description |
---|---|
MemberSubstitution.WithoutSpecification |
constructor(ElementMatcher<? super MethodDescription> matcher)
Substitutes any constructor invocation that matches the given matcher.
|
MemberSubstitution.WithoutSpecification |
element(ElementMatcher<? super ByteCodeElement.Member> matcher)
Substitutes any interaction with a field or method that matches the given matcher.
|
MemberSubstitution |
failIfNoMatch(boolean failIfNoMatch)
Specifies if this substitution should fail if applied on a method without a match.
|
MemberSubstitution.WithoutSpecification.ForMatchedField |
field(ElementMatcher<? super FieldDescription> matcher)
Substitutes any field access that matches the given matcher.
|
MemberSubstitution.WithoutSpecification |
invokable(ElementMatcher<? super MethodDescription> matcher)
Substitutes any method or constructor invocation that matches the given matcher.
|
MemberSubstitution.WithoutSpecification.ForMatchedMethod |
method(ElementMatcher<? super MethodDescription> matcher)
Substitutes any method invocation that matches the given matcher.
|
AsmVisitorWrapper.ForDeclaredMethods |
on(ElementMatcher<? super MethodDescription> matcher)
Applies this member substitution to any method that matches the supplied matcher.
|
static MemberSubstitution |
relaxed()
Creates a member substitution that skips any unresolvable fields or methods that are referenced within a method body.
|
static MemberSubstitution |
strict()
Creates a member substitution that requires the resolution of all fields and methods that are referenced within a method body.
|
MemberSubstitution |
with(MemberSubstitution.TypePoolResolver typePoolResolver)
Specifies a type pool resolver to be used for locating members.
|
MemberSubstitution |
with(MethodGraph.Compiler methodGraphCompiler)
Specifies the use of a specific method graph compiler for the resolution of virtual methods.
|
MethodVisitor |
wrap(TypeDescription instrumentedType,
MethodDescription instrumentedMethod,
MethodVisitor methodVisitor,
Implementation.Context implementationContext,
TypePool typePool,
int writerFlags,
int readerFlags)
Wraps a method visitor.
|
protected static final int THIS_REFERENCE
protected MemberSubstitution(boolean strict)
strict
- true
if the method processing should be strict where an exception is raised if a member cannot be found.protected MemberSubstitution(MethodGraph.Compiler methodGraphCompiler, MemberSubstitution.TypePoolResolver typePoolResolver, boolean strict, boolean failIfNoMatch, MemberSubstitution.Replacement.Factory replacementFactory)
methodGraphCompiler
- The method graph compiler to use.typePoolResolver
- The type pool resolver to use.strict
- true
if the method processing should be strict where an exception is raised if a member cannot be found.failIfNoMatch
- true
if the instrumentation should fail if applied to a method without match.replacementFactory
- The replacement factory to use.public static MemberSubstitution strict()
public static MemberSubstitution relaxed()
public MemberSubstitution.WithoutSpecification element(ElementMatcher<? super ByteCodeElement.Member> matcher)
matcher
- The matcher to determine what access to byte code elements to substitute.public MemberSubstitution.WithoutSpecification.ForMatchedField field(ElementMatcher<? super FieldDescription> matcher)
matcher
- The matcher to determine what fields to substitute.public MemberSubstitution.WithoutSpecification.ForMatchedMethod method(ElementMatcher<? super MethodDescription> matcher)
matcher
- The matcher to determine what methods to substitute.public MemberSubstitution.WithoutSpecification constructor(ElementMatcher<? super MethodDescription> matcher)
matcher
- The matcher to determine what constructors to substitute.public MemberSubstitution.WithoutSpecification invokable(ElementMatcher<? super MethodDescription> matcher)
matcher
- The matcher to determine what method or constructors to substitute.public MemberSubstitution with(MethodGraph.Compiler methodGraphCompiler)
methodGraphCompiler
- The method graph compiler to use.public MemberSubstitution with(MemberSubstitution.TypePoolResolver typePoolResolver)
typePoolResolver
- The type pool resolver to use.public MemberSubstitution failIfNoMatch(boolean failIfNoMatch)
failIfNoMatch
- true
if the instrumentation should fail if applied to a method without match.public AsmVisitorWrapper.ForDeclaredMethods on(ElementMatcher<? super MethodDescription> matcher)
matcher
- The matcher to determine this substitutions application.public MethodVisitor wrap(TypeDescription instrumentedType, MethodDescription instrumentedMethod, MethodVisitor methodVisitor, Implementation.Context implementationContext, TypePool typePool, int writerFlags, int readerFlags)
wrap
in interface AsmVisitorWrapper.ForDeclaredMethods.MethodVisitorWrapper
instrumentedType
- The instrumented type.instrumentedMethod
- The method that is currently being defined.methodVisitor
- The original field visitor that defines the given method.implementationContext
- The implementation context to use.typePool
- The type pool to use.writerFlags
- The ASM ClassWriter
reader flags to consider.readerFlags
- The ASM ClassReader
reader flags to consider.Copyright © 2014–2024. All rights reserved.