TransformerString(String.contains 改写)

基本信息

属性 值
类型 字节码转换器(可配置)
实现类 net.vfyjxf.nechar.transform.transformers.TransformerString
父类 Transformer.Configurable
getName() string contains
注册顺序 第 1 个(见 转换器注册表)
来源 基于 Towdium 的 JustEnoughCharacters 1.12.0 版 TransformerString.java 改写(MIT 协议)

改写目标

只改写一个调用点:

原调用 替换为 描述符
java/lang/String.contains(CharSequence)Z(INVOKEVIRTUAL) net/vfyjxf/nechar/utils/Match.contains(INVOKESTATIC) (Ljava/lang/String;Ljava/lang/CharSequence;)Z

调用参数:

Transformer.transformInvoke(
    n,
    "java/lang/String",                        // owner
    "contains",                                 // name
    "net/vfyjxf/nechar/utils/Match",            // newOwner
    "contains",                                 // newName
    "(Ljava/lang/String;Ljava/lang/CharSequence;)Z", // id
    false,                                      // isInterface
    Opcodes.INVOKESTATIC,                       // op
    "(Ljava/lang/Object;)Z",                    // arg1
    "(Ljava/lang/String;)Z");                   // arg2

arg1 / arg2 的作用

由于 arg1 与 arg2 均非 null,transformInvoke 除普通方法调用外还会处理 INVOKEDYNAMIC 指令:若某条 invokedynamic 的 bsmArgs[1] 是 Handle,且该 Handle 的 owner 为 java/lang/String、name 为 contains,则用 new Handle(6, "net/vfyjxf/nechar/utils/Match", "contains", id) 替换之。

arg1 = "(Ljava/lang/Object;)Z" 与 arg2 = "(Ljava/lang/String;)Z" 对应 java.util.regex.Pattern 的方法引用类型描述符——Kotlin 编译出的 invokedynamic 常把 String.contains 作为方法引用参数传入。这也是本转换器能覆盖 Kotlin 编写界面代码的原因。

效果

目标方法列表中命中的方法,其内部所有 String.contains 调用(包括以方法引用形式传入的)都被换成拼音感知的 匹配核心 Match 实现,因此这些界面里的搜索框可以输入拼音。

配置数据源

抽象方法 返回
getDefault() NechConfig.defaultTransformerStringList(22 项,其中 1 项重复,见 默认转换目标列表)
getAdditional() NechConfig.transformerStringAdditionalList(配置项 AdditionalTransformerStringList,默认空)
黑名单 NechConfig.transformerMethodBlackList(配置项 transformerMethodBlackList,默认空)

三者按"默认 + 附加 − 黑名单"在 reload() 中合并。

相关条目