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 forModifier
排除(省略)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");
}
}
}