文章目录
  1. 1. 快速导航
  • 在方法起始
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在返回之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在最终返回之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在调用之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在仅有一字符串参数的Void返回值方法调用之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在调用之后
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在字段访问之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在调用对象构造方法之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在常量使用之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 本文翻译自:Injection Point Reference

    快速导航

    简写名全名
    HEADorg.spongepowered.asm.mixin.injection.points.MethodHead
    RETURNorg.spongepowered.asm.mixin.injection.points.BeforeReturn
    TAILorg.spongepowered.asm.mixin.injection.points.BeforeFinalReturn
    INVOKEorg.spongepowered.asm.mixin.injection.points.BeforeInvoke
    INVOKE_STRINGorg.spongepowered.asm.mixin.injection.points.BeforeStringInvoke
    INVOKE_ASSIGNorg.spongepowered.asm.mixin.injection.points.AfterInvoke
    FIELDorg.spongepowered.asm.mixin.injection.points.BeforeFieldAccess
    NEWorg.spongepowered.asm.mixin.injection.points.BeforeNew
    CONSTANTorg.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的参数指定要匹配的字符串常量。

    注释

    此查询只能用于匹配参数作为字符串文本传递的调用。

    关于targetordinal的应用顺序,请参见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
    要搜索的指令操作符(必须是GETSTATICPUTSTATICGETFIELDPUTFIELD中的一个),如未指定则匹配所有字段访问
    ordinal
    要选择的字段访问的索引序号(如果省略,则全选)
    参数
    boolean log
    当注入器扫描方法时,在控制台中生成详细的输出,这对诊断不正确的行为或以意外方式注入的注入器非常有帮助

    描述

    此注入点在目标指令列表中搜索GETFIELDPUTFIELD指令(及其静态的等效指令),并返回符合条件的指令。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
    为后向兼容的替代targetNEW最初仅支持此参数)。与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时存在特殊情况。例如:
    if (x >= 0)
    出现这种特殊情况是因为Java包含用于这种类型的比较的显式指令,因此编译后的代码可能更像这样:
    if (x.isGreaterThanOrEqualToZero())
    当然如果我们知道正在搜索的常量是比较表达式的一部分,那么我们可以显式地搜索isGreaterThanOrEqualToZero并将其转换为原始形式,以便像任何其他常量访问一样重定向它

    如要启用此行为,可以基于要展开的表达式类型为次参数指定一个或多个值。因为Java编译器习惯将某些表达式编译为与其源代码对应的表达式(例如,编译当大于某值时做某事结构为如果小于或等于某值则不做某事);指定特定的表达式类型也隐式包括逆表达式。

    值得注意的是,其对序号的影响可能很难预测,因此应注意确保所选注入点与预期位置匹配

    指定此选项具有以下效果:

    • 目标方法中的条件匹配操作符被识别为注入候选
    • intValue0是隐式的,不需要显式定义
    • 但是,显式指定intValue0将导致此选择器也与方法体重的显示0常量匹配
    要为该选项指定值,请用逗号或空格分隔条件值,例如:
    "expandZeroConditions=LESS_THAN_ZERO,GREATER_THAN_ZERO"

    描述

    此注入点在目标指令列表中搜索字面值(常量),并返回与条件相匹配的指令。请注意,所有鉴别参数都是互斥的,并且只应指定一个鉴别参数。指定多个鉴别参数将抛出异常。

    注释

    注意,与其他注入点一致,ordinal适用于注入点其他参数的总体结果。在词语顺序中,ordinal始终最后应用。

    文章目录
    1. 1. 快速导航
  • 在方法起始
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在返回之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在最终返回之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在调用之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在仅有一字符串参数的Void返回值方法调用之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在调用之后
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在字段访问之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在调用对象构造方法之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释
  • 在常量使用之前
    1. 1. 概览
    2. 2. 描述
    3. 3. 注释