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始终最后应用。
