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

标签 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

最佳答案

简要说明

根据答案 here,有两个值为 0x80 (128) 的标志,VARARGS 和 TRANSIENT , 所以该方法实际上是一个可变参数方法。

JavaDoc确认此方法是可变参数,因此标志有意义

工作示例

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");
    }
  }
}

关于java.lang.reflect.Method#getModifiers 返回有效范围外的标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46090647/

相关文章:

java - 尽管不在任何框架或 iframe 或窗口内,但无法单击链接

java - 网格中的 GXT 复选框

java - 如何在不扩展它的情况下从一个类获取到另一个类的值(value)?

scala - Sbt run命令在Docker容器上失败并显示 “NoSuchFileException”

php - 有没有办法访问给定对象的所有引用?

java - 如何为java代理指定类路径

scala - hector scala 类型不匹配

scala - 如何使用sbt-proguard实现类似maven的依赖阴影?

java - Android通过反射重写私有(private)方法

java - 有没有办法以声明的顺序从java类中获取私有(private)字段名称