java.lang.reflect.Method#getModifiers返回有效范围之外的标志?

时间:2017-09-07 07:40:35

标签: java scala reflection jvm

以下代码:

Class.forName("java.lang.String")
     .getDeclaredMethods
     .find(_.getName == "join")
     .get
     .getModifiers & ~(java.lang.reflect.Modifier.methodModifiers())

评估为128。在我看来,评估为0,因为附加到java.lang.String#join方法的每个修饰符都应位于java.lang.reflect.Modifier.methodModifiers()

的集合

查看java.lang.reflect.Modifier中的常量,似乎128对应于修饰符位java.lang.reflect.Modifier.TRANSIENT。如何将方法标记为transient

1 个答案:

答案 0 :(得分:3)

简要说明

根据答案here,有两个标志值为0x80(128),VARARGS和TRANSIENT,因此该方法实际上是一种varargs方法。

JavaDoc确认此方法为varargs,因此该标志有意义

工作示例

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

class TestClass {
  public static void main(final String... args) throws Throwable{
    int methodModifiers = Class.forName("java.lang.String")
        .getDeclaredMethod("join", CharSequence.class, CharSequence[].class)
        .getModifiers();

    Field varargsField = Class.forName("java.lang.reflect.Modifier")
        .getDeclaredField("VARARGS");
    varargsField.setAccessible(true);

    int varargsF = varargsField.getInt(null);
    int staticF = Modifier.STATIC;
    int publicF = Modifier.PUBLIC;

    if (methodModifiers == publicF + staticF + varargsF) {
      System.out.println("Correct");
    } else {
      System.out.println("Wrong");
    }
  }
}