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() 中合并。
相关条目
- 转换器注册表 - 注册顺序、
Configurable工作流与MethodDecoder - 默认转换目标列表 - 本转换器默认改写哪些方法
- TransformerRegExp - 改写正则相关调用的姊妹转换器
- 匹配核心 Match - 被注入的
Match.contains实现 - 配置系统 - 附加列表与黑名单配置项