Package io.micronaut.inject.writer
Class DispatchWriter
java.lang.Object
io.micronaut.inject.writer.AbstractClassFileWriter
io.micronaut.inject.writer.DispatchWriter
- All Implemented Interfaces:
ClassOutputWriter
,OriginatingElements
,org.objectweb.asm.Opcodes
@Internal
public final class DispatchWriter
extends AbstractClassFileWriter
implements org.objectweb.asm.Opcodes
Switch based dispatch writer.
- Since:
- 3.1
- Author:
- Denis Stepanov
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic interface
Dispatch target implementation writer.static interface
State carried between differentDispatchWriter.DispatchTarget
s.static final class
Field get dispatch target.static final class
Field set dispatch target.static final class
Interceptable method invocation dispatch target.static class
Method invocation dispatch target. -
Field Summary
Fields inherited from class io.micronaut.inject.writer.AbstractClassFileWriter
ARRAY_PATTERN, CONSTRUCTOR_NAME, DEFAULT_MAX_STACK, DESCRIPTOR_DEFAULT_CONSTRUCTOR, METHOD_CREATE_ARGUMENT_SIMPLE, METHOD_CREATE_TYPE_VARIABLE_SIMPLE, METHOD_DEFAULT_CONSTRUCTOR, METHOD_GENERIC_PLACEHOLDER_SIMPLE, originatingElements, TYPE_ARGUMENT, TYPE_ARGUMENT_ARRAY, TYPE_CLASS, TYPE_GENERATED, TYPE_OBJECT, ZERO_ARGUMENTS_CONSTANT
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V9
-
Constructor Summary
ConstructorDescriptionDispatchWriter
(org.objectweb.asm.Type thisType) DispatchWriter
(org.objectweb.asm.Type thisType, org.objectweb.asm.Type dispatchSuperType) -
Method Summary
Modifier and TypeMethodDescriptionvoid
accept
(ClassWriterOutputVisitor classWriterOutputVisitor) Accept a ClassWriterOutputVisitor to write this writer to disk.int
addDispatchTarget
(DispatchWriter.DispatchTarget dispatchTarget) Adds new custom dispatch target.int
addGetField
(FieldElement beanField) Adds new get field dispatch target.int
addInterceptedMethod
(TypedElement declaringType, MethodElement methodElement, String interceptedProxyClassName, String interceptedProxyBridgeMethodName) Adds new interceptable method dispatch target.int
addMethod
(TypedElement declaringType, MethodElement methodElement) Adds new method dispatch target.int
addMethod
(TypedElement declaringType, MethodElement methodElement, boolean useOneDispatch) Adds new method dispatch target.int
addSetField
(FieldElement beanField) Adds new set field dispatch target.void
buildDispatchMethod
(org.objectweb.asm.ClassWriter classWriter) Build dispatch method if needed.void
buildDispatchOneMethod
(org.objectweb.asm.ClassWriter classWriter) Build dispatch one method if needed.void
buildGetTargetMethodByIndex
(org.objectweb.asm.ClassWriter classWriter) Build get target method by index method if needed.static int
computeKotlinDefaultsMask
(org.objectweb.asm.commons.GeneratorAdapter writer, BiConsumer<Integer, ParameterElement> argumentsPusher, List<ParameterElement> parameters) Computes Kotlin default method mask.boolean
static void
pushTypeUtilsGetRequiredMethod
(org.objectweb.asm.commons.GeneratorAdapter builder, org.objectweb.asm.Type declaringTypeObject, MethodElement methodElement) Methods inherited from class io.micronaut.inject.writer.AbstractClassFileWriter
addOriginatingElement, buildArgument, buildArgument, buildArgumentWithGenerics, buildArgumentWithGenerics, generateServiceDescriptor, getClassFileName, getConstructorDescriptor, getConstructorDescriptor, getConstructorDescriptor, getInternalName, getInternalNameForCast, getInternalNameForCast, getInternalNameForCast, getMethodDescriptor, getMethodDescriptor, getMethodDescriptor, getMethodDescriptor, getMethodDescriptorForReturnType, getMethodSignature, getObjectType, getOriginatingElement, getOriginatingElements, getTypeDescriptor, getTypeDescriptor, getTypeDescriptor, getTypeDescriptor, getTypeReference, getTypeReferenceForName, getTypes, implementInterceptedTypeMethod, invokeConstructor, invokeInterfaceStaticMethod, invokeMethod, newClassWriterOutputVisitor, pushBoxPrimitiveIfNecessary, pushBoxPrimitiveIfNecessary, pushBoxPrimitiveIfNecessary, pushBuildArgumentsForMethod, pushCastToType, pushCastToType, pushCastToType, pushCreateArgument, pushListOfString, pushMethodNameAndTypesArguments, pushNewArray, pushNewArray, pushNewInstance, pushReturnTypeArgument, pushReturnValue, pushStoreInArray, pushStoreInArray, pushStoreStringInArray, pushStoreTypeInArray, pushStringMapOf, pushTypeArgumentElements, returnVoid, startClass, startClass, startConstructor, startConstructor, startFinalClass, startProtectedMethod, startPublicClass, startPublicFinalClass, startPublicFinalMethodZeroArgs, startPublicMethod, startPublicMethod, startPublicMethodZeroArgs, startService, startService, toTypeString, visitStaticInitializer, writeBooleanMethod, writeClassToDisk, writeClassToDisk, writeTo
-
Constructor Details
-
DispatchWriter
public DispatchWriter(org.objectweb.asm.Type thisType) -
DispatchWriter
public DispatchWriter(org.objectweb.asm.Type thisType, org.objectweb.asm.Type dispatchSuperType)
-
-
Method Details
-
addSetField
Adds new set field dispatch target.- Parameters:
beanField
- The field- Returns:
- the target index
-
addGetField
Adds new get field dispatch target.- Parameters:
beanField
- The field- Returns:
- the target index
-
addMethod
Adds new method dispatch target.- Parameters:
declaringType
- The declaring typemethodElement
- The method element- Returns:
- the target index
-
addMethod
public int addMethod(TypedElement declaringType, MethodElement methodElement, boolean useOneDispatch) Adds new method dispatch target.- Parameters:
declaringType
- The declaring typemethodElement
- The method elementuseOneDispatch
- If method should be dispatched using "dispatchOne"- Returns:
- the target index
-
addInterceptedMethod
public int addInterceptedMethod(TypedElement declaringType, MethodElement methodElement, String interceptedProxyClassName, String interceptedProxyBridgeMethodName) Adds new interceptable method dispatch target.- Parameters:
declaringType
- The declaring typemethodElement
- The method elementinterceptedProxyClassName
- The interceptedProxyClassNameinterceptedProxyBridgeMethodName
- The interceptedProxyBridgeMethodName- Returns:
- the target index
-
addDispatchTarget
Adds new custom dispatch target.- Parameters:
dispatchTarget
- The dispatch target implementation- Returns:
- the target index
-
buildDispatchMethod
public void buildDispatchMethod(org.objectweb.asm.ClassWriter classWriter) Build dispatch method if needed.- Parameters:
classWriter
- The classwriter
-
buildDispatchOneMethod
public void buildDispatchOneMethod(org.objectweb.asm.ClassWriter classWriter) Build dispatch one method if needed.- Parameters:
classWriter
- The classwriter
-
buildGetTargetMethodByIndex
public void buildGetTargetMethodByIndex(org.objectweb.asm.ClassWriter classWriter) Build get target method by index method if needed.- Parameters:
classWriter
- The classwriter
-
pushTypeUtilsGetRequiredMethod
public static void pushTypeUtilsGetRequiredMethod(org.objectweb.asm.commons.GeneratorAdapter builder, org.objectweb.asm.Type declaringTypeObject, MethodElement methodElement) -
accept
Description copied from interface:ClassOutputWriter
Accept a ClassWriterOutputVisitor to write this writer to disk.- Specified by:
accept
in interfaceClassOutputWriter
- Parameters:
classWriterOutputVisitor
- TheClassWriterOutputVisitor
- Throws:
IOException
- if there is an error writing to disk
-
getDispatchTargets
- Returns:
- all added dispatch targets
-
isHasInterceptedMethod
public boolean isHasInterceptedMethod()- Returns:
- if intercepted method dispatch have been added
-
computeKotlinDefaultsMask
public static int computeKotlinDefaultsMask(org.objectweb.asm.commons.GeneratorAdapter writer, BiConsumer<Integer, ParameterElement> argumentsPusher, List<ParameterElement> parameters) Computes Kotlin default method mask.- Parameters:
writer
- The writerargumentsPusher
- The argument pusherparameters
- The arguments- Returns:
- The mask
-