以下代码:
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/