Mixin参考——注入点参考
快速导航
简写名 | 全名 |
---|---|
HEAD | org.spongepowered.asm.mixin.injection.points.MethodHead |
RETURN | org.spongepowered.asm.mixin.injection.points.BeforeReturn |
TAIL | org.spongepowered.asm.mixin.injection.points.BeforeFinalReturn |
INVOKE | org.spongepowered.asm.mixin.injection.points.BeforeInvoke |
INVOKE_STRING | org.spongepowered.asm.mixin.injection.points.BeforeStringInvoke |
INVOKE_ASSIGN | org.spongepowered.asm.mixin.injection.points.AfterInvoke |
FIELD | org.spongepowered.asm.mixin.injection.points.BeforeFieldAccess |
NEW | org.spongepowered.asm.mixin.injection.points.BeforeNew |
CONSTANT | org.spongepowered.asm.mixin.injection.points.BeforeConstant |
在方法起始
概览
简写名 HEAD 全名 org.spongepowered.asm.mixin.injection.points.MethodHead 选项 无 参数 无 描述
此注入点始终返回候选列表中的第一条指令。在方法中选择时,始终是方法中的第一条指令;在指令片段(slice)中选择时,始终是指令片段中的第一条指令。
注释
此注入点保证只选择一条指令。
在返回之前
概览
简写名 RETURN 全名 org.spongepowered.asm.mixin.injection.points.BeforeReturn 选项
- ordinal
- 要选中的RETURN指令的序号(从0开始索引)
参数 无 描述
此注入点选择目标指令列表中的RETURN(返回)操作符。如果未指定ordinal(序号),则选择所有RETURN指令。
序号 检索范围 结果 原因 省略的 方法 1个或更多指令 方法保证至少有1个RETURN 指定的 方法 0或1个指令 与ordinal匹配的RETURN可能不存在 省略的 指令片段 0个或更多指令 匹配指令片段中的所有RETURN,其中也可能不包含任何RETURN 指定的 指令片段 0或1个指令 匹配指令片段中的一个RETURN,其中也可能不包含期望的指令 注释
这是@Inject注入器注入构造函数时唯一允许使用的注入点。
当与可取消的非空注入结合使用时,此注入点将使返回类型在CallbackInfoReturnable中通过getReturnType()方法可用。
在最终返回之前
概览
简写名 TAIL 全名 org.spongepowered.asm.mixin.injection.points.BeforeFinalReturn 选项 无 参数 无 描述
此注入点返回目标方法中最后一个
RETURN
操作符。注释
请注意,最后一个“RETURN”操作符可能与原Java源代码中方法的概念上的“最后”不对应,因为条件表达式可能导致编译得到的字节码与原Java源代码的顺序有显著差异。
在调用之前
概览
简写名 INVOKE 全名 org.spongepowered.asm.mixin.injection.points.BeforeInvoke 选项
- target
- 被调用的目标,如果被重映射,则必须写上全名
- ordinal
- 要选中的已匹配的调用的索引序号(如果忽略该项,则全选)
参数
- boolean log
- 当注入器扫描方法时,在控制台中生成详细的输出,这对诊断不正确的行为或以意外方式注入的注入器非常有帮助
描述
此注入点在目标指令列表中搜索invoke指令,并返回与条件匹配的指令。
target
应该是一个可解析的MemberInfo,它指定要搜索的调用(省略target
将返回目标中的所有调用指令。序号指定要选择的调用的索引,如果省略,则返回所有匹配的调用。注释
ordinal
值是在与target
匹配的指令中选择,因此如果目标方法中有4个调用指令,但只有2个与target
中指定的值匹配,那么给定ordinal=1
将选择与target
匹配的第二个指令,而不是方法中的第二个调用。换句话说,target
总应用在ordinal
前。
在仅有一字符串参数的Void返回值方法调用之前
概览
简写名 INVOKE_STRING 全名 org.spongepowered.asm.mixin.injection.points.BeforeStringInvoke 选项
- target
- 被调用的目标,如果被重映射,则必须写上全名
- ordinal
- 要选中的已匹配的调用的索引序号(如果忽略该项,则全选)
参数
- string ldc
- 要匹配的常量值,请参见描述
- boolean log
- 当注入器扫描方法时,在控制台中生成详细的输出,这对诊断不正确的行为或以意外方式注入的注入器非常有帮助
描述
如同BeforeInvoke,此注入点在目标指令列表中搜素invoke指令,并返回与条件匹配的指令。此特化版本只匹配接受单个
String
并返回void
的方法,字符串本身必须是文本字符串,并作为查询过程的一部分进行匹配。此查询的主要目的是特定匹配
Profiler::startSection
的调用和只接受文本字符串的类似方法。应使用名为
ldc
的参数指定要匹配的字符串常量。注释
此查询只能用于匹配参数作为字符串文本传递的调用。
关于
target
与ordinal
的应用顺序,请参见BeforeInvoke中的注释。
在调用之后
概览
简写名 INVOKE_ASSIGN 全名 org.spongepowered.asm.mixin.injection.points.AfterInvoke 选项
- target
- 被调用的目标,必须是非void返回类型,如果重映射,则必须写上全名
- ordinal
- 要选中的已匹配的调用的索引序号(如果忽略该项,则全选)
参数
- boolean log
- 当注入器扫描方法时,在控制台中生成详细的输出,这对诊断不正确的行为或以意外方式注入的注入器非常有帮助
描述
与
BeforeInvoke
类似,此注入点在目标指令列表中搜索invoke指令,并返回符合条件的指令。但是目标指令必须返回一个值。如果满足此条件,则注入点立即返回调用之后的指令。如果调用紧接着是的STORE
指令(例如,调用的结果储存在一个局部变量中),则注入点返回紧跟在STORE
指令之后的指令。注释
此注入点以与
BeforeInvoke
完全相同的方式选择候选指令,因此注意事项相同。
在字段访问之前
概览
简写名 FIELD 全名 org.spongepowered.asm.mixin.injection.points.BeforeFieldAccess 选项
- target
- 被访问的目标字段,如果重映射,则必须写上全名
- opcode
- 要搜索的指令操作符(必须是GETSTATIC、PUTSTATIC、GETFIELD或PUTFIELD中的一个),如未指定则匹配所有字段访问
- ordinal
- 要选择的字段访问的索引序号(如果省略,则全选)
参数
- boolean log
- 当注入器扫描方法时,在控制台中生成详细的输出,这对诊断不正确的行为或以意外方式注入的注入器非常有帮助
描述
此注入点在目标指令列表中搜索
GETFIELD
和PUTFIELD
指令(及其静态的等效指令),并返回符合条件的指令。target
应该是一个可解析的MemberInfo,它指定要搜索的字段名(省略target
将返回目标中相应类型的所有访问指令)。序号指定要选择的指令的索引,如果省略,则返回所有匹配的字段访问指令。注释
ordinal
值是在与target
匹配的指令中选择,因此如果目标方法中有4个字段访问指令,但只有2个与target
中指定的值匹配,那么给定ordinal=1
将选择与target
匹配的第二个指令,而不是方法中的第二个字段访问。换句话说,target
总应用在ordinal
前。
在调用对象构造方法之前
概览
简写名 NEW 全名 org.spongepowered.asm.mixin.injection.points.BeforeNew 选项
- target
- 要重映射的构造方法描述符,改描述符必须仅包含类名或类名和构造方法签名
- ordinal
- 要选择的NEW操作符的索引序号(如果省略,则为全部)
参数
- String class
- 为后向兼容的替代target( NEW最初仅支持此参数)。与target相同,仅能指定一个或另一个构造方法
描述
此注入点在目标指令列表中搜索
NEW
指令,并返回符合条件的指令。如果指定了target
,则只返回指定类型的NEW
指令。如果target
包含方法签名(该签名必须指定void(V
)为返回类型),则只返回后跟有给定签名的INVOKESPECIAL(<init>)指令的NEW
指令。注意,总是返回NEW
指令,而不是INVOKESPECIAL
。注释
注意,与其他注入点一样,
ordinal
适用于其他注入点参数的相同结论。因此,如果使用target
标识NEW
操作符的子集,ordinal
将基于此子集进行选择,而不是在目标中的整个NEW
操作符池中进行选择。在词语顺序中,ordinal
始终最后应用。
在常量使用之前
概览
简写名 CONSTANT 全名 org.spongepowered.asm.mixin.injection.points.BeforeConstant 选项
- ordinal
- 要选择的NEW操作符的索引序号(如果省略,则为全部)
参数
- boolean nullValue
- 将此值设置为true以匹配方法体中的null
- int intValue
- 将此值设置为要在方法体中匹配的整数。请注意,如果要匹配构成条件表达式中的一部分0值,可能还需要设置expandZeroConditions参数
- float floatValue
- 将此值设置为要在方法体中匹配的单精度浮点数
- long longValue
- 将此值设置为要在方法体中匹配的长整数
- double doubleValue
- 将此值设置为要在方法体中匹配的双精度浮点数
- String stringValue
- 将此值设置为要在方法体中匹配的文本
- String class
- 将此值设置为要在方法体中匹配的Class
- boolean log
- 将此值设置为true以在应用此注入点查询时发出日志信息
- String expandZeroConditions
- 虽然大多数常量可以相对容易地位于编译后的方法中,但在条件表达式中使用0时存在特殊情况。例如:
出现这种特殊情况是因为Java包含用于这种类型的比较的显式指令,因此编译后的代码可能更像这样:if (x >= 0)
当然如果我们知道正在搜索的常量是比较表达式的一部分,那么我们可以显式地搜索isGreaterThanOrEqualToZero并将其转换为原始形式,以便像任何其他常量访问一样重定向它if (x.isGreaterThanOrEqualToZero())
如要启用此行为,可以基于要展开的表达式类型为次参数指定一个或多个值。因为Java编译器习惯将某些表达式编译为与其源代码对应的逆表达式(例如,编译当大于某值时做某事结构为如果小于或等于某值则不做某事);指定特定的表达式类型也隐式包括逆表达式。
值得注意的是,其对序号的影响可能很难预测,因此应注意确保所选注入点与预期位置匹配
指定此选项具有以下效果:要为该选项指定值,请用逗号或空格分隔条件值,例如:
- 目标方法中的条件匹配操作符被识别为注入候选
- intValue为0是隐式的,不需要显式定义
- 但是,显式指定intValue为0将导致此选择器也与方法体重的显示0常量匹配
"expandZeroConditions=LESS_THAN_ZERO,GREATER_THAN_ZERO"
描述
此注入点在目标指令列表中搜索字面值(常量),并返回与条件相匹配的指令。请注意,所有鉴别参数都是互斥的,并且只应指定一个鉴别参数。指定多个鉴别参数将抛出异常。
注释
注意,与其他注入点一致,
ordinal
适用于注入点其他参数的总体结果。在词语顺序中,ordinal
始终最后应用。