[英]java.lang.reflect.Method#getModifiers returns flag outside valid range?
The following code: 以下代码:
Class.forName("java.lang.String")
.getDeclaredMethods
.find(_.getName == "join")
.get
.getModifiers & ~(java.lang.reflect.Modifier.methodModifiers())
Evaluates to 128
. 评估为
128
。 It seems to me that it should evaluate to 0
, because every modifier that's attached to the java.lang.String#join
method should be within the set of java.lang.reflect.Modifier.methodModifiers()
. 在我看来它应该求值为
0
,因为附加到java.lang.String#join
方法的每个修饰符都应该在java.lang.reflect.Modifier.methodModifiers()
的集合中。
Looking at the constants in java.lang.reflect.Modifier
, it seems that 128
corresponds to the modifier bit java.lang.reflect.Modifier.TRANSIENT
. 查看
java.lang.reflect.Modifier
中的常量,似乎128
对应于修饰符位java.lang.reflect.Modifier.TRANSIENT
。 How can a method end up being flagged as transient
? 一个方法如何最终被标记为
transient
?
There are two flags with the value 0x80 (128), VARARGS and TRANSIENT, as per the answer here , so the method is actually a varargs method. 根据这里的答案,有两个标志值为0x80(128),VARARGS和TRANSIENT,因此该方法实际上是一个varargs方法。
The JavaDoc confirm that this method is varargs, so the flag makes sense 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");
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.