diff --git a/docs/guide/special-feature.md b/docs/guide/special-feature.md index 8663623e..98bc0898 100644 --- a/docs/guide/special-feature.md +++ b/docs/guide/special-feature.md @@ -178,7 +178,7 @@ Test::class.java.method { ### 静态字节码 -有些方法和变量在类中是静态的实现,这个时候,我们不需要传入实例就可以调用它们。 +有些方法和变量在 `Class` 中是静态的实现,这个时候,我们不需要传入实例就可以调用它们。 假设我们这次要得到静态变量 `TAG` 的内容。 @@ -191,7 +191,7 @@ Test::class.java.field { }.get().string() // Field 的类型是字符串,可直接进行 cast ``` -假设类中存在同名的非静态 `TAG` 变量,这个时候怎么办呢? +假设 `Class` 中存在同名的非静态 `TAG` 变量,这个时候怎么办呢? 加入一个筛选条件即可。 @@ -568,6 +568,59 @@ method { } ``` +#### 必要的查询条件 + +!> 在方法、构造方法查询条件中,即使是无参的方法也需要设置查询条件。 + +假设我们有如下的 `Class`。 + +> 示例如下 + +```java +public class TestFoo { + + public void foo(String string) { + // ... + } + + public void foo() { + // ... + } +} +``` + +我们要得到其中的 `public void foo()` 方法,可以写作如下形式。 + +> 示例如下 + +```kotlin +TestFoo::class.java.method { + name = "foo" +} +``` + +但是,上面的例子是错误的。 + +你会发现这个 `Class` 中有两个 `foo` 方法,其中一个带有方法参数,由于没有设置 `param` 的查询条件,使用上述例子得到的结果将会是匹配名称且匹配字节码顺序的第一个方法,而不是我们需要的最后一个方法。 + +这是一个经常会出现的错误,没有方法参数就不去写方法参数查询条件的错误做法。 + +正确的使用方法如下。 + +> 示例如下 + +```kotlin +TestFoo::class.java.method { + name = "foo" + // ✅ 正确的使用方法,添加详细的筛选条件 + emptyParam() +} +``` + +至此,上述的示例将可以完美地匹配到 `public void foo()` 方法。 + +> PS:在较旧的 API 版本中是允许匹配不写默认匹配无参方法的做法的,但是最新版本更正了这一问题,请确保你使用的是最新版本的 API。 + #### 字节码类型 !> 在字节码调用结果中,`cast` 方法只能指定字节码对应的类型。