Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.reflect.Method#getModifiers返回超出有效范围的标志?_Java_Scala_Reflection_Jvm - Fatal编程技术网

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

java.lang.reflect.Method#getModifiers返回超出有效范围的标志?,java,scala,reflection,jvm,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.l

以下代码:

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
。一个方法怎么会被标记为“瞬态”

简要说明 根据答案,有两个值为0x80(128)的标志VARARGS和TRANSIENT,因此该方法实际上是VARARGS方法

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

工作实例
作为一个提示,对于这样的问题,我会先尝试用纯Java重现——我强烈怀疑您会得到相同的结果,然后这就从问题中消除了Scala,使问题更适合“纯Java”
java.lang.reflect.Modifier
中的常量源于所有位都不含糊的时候,不管您是查看字段、方法还是类的修饰符。自Java 5以来,情况就不再如此了,新的修饰符位没有添加到class.TIL中。但是我更喜欢Ammonite screenshot.Javadoc for
Modifier
排除(省略)jvm规范第4.6节中关于方法的表。如果他们明确表达自己的意图,就不会那么令人困惑了。比较4.5和4.6,volatile和bridge也过载。
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");
    }
  }
}