11

我在使用反射时发现了有趣的事情。我试图检索简单类的构造函数及其修饰符。

public class Test {
    public Test(Object... args) {}
}

这是检索构造函数修饰符的代码:

Class<?> clazz = Test.class;
Constructor<?>[] ctors = clazz.getDeclaredConstructors();
for (Constructor<?> ctor : ctors) {        
    int mod = ctor.getModifiers();
    /*if not package-private modifier*/
    if(mod!=0) {
        System.out.println( Modifier.toString(mod)));
    }
}

结果是:

    public transient  

如果我传递给构造函数不是变量参数,而只是数组,那没关系。

public class Test {
    public Test(Object[] args) {}
}

结果是:

    public  

无论构造函数修饰符(public、protected、private)或参数类型(原始或引用)如何,都会发生同样的情况。怎么可能,而“瞬态”不是构造函数的有效修饰符?

4

1 回答 1

17

访问修饰符在类文件中编码为位掩码。JVM 规范根据它们是否出现在方法修饰符或字段修饰符中为某些位分配不同的含义。第 7 位 ( 0x0080) 就是这样的一位。

对于方法

ACC_VARARGS    0x0080  Declared with variable number of arguments.

对于字段

ACC_TRANSIENT  0x0080  Declared transient; not written or read by a persistent
                       object manager.

由于您正在查看一种方法,因此此修饰符的正确解释是ACC_VARARGSand not ACC_TRANSIENT

但是,Modifier该类似乎只能处理 JVM 规范中定义的修饰符子集。因为它只需要一个,int它无法区分。ACC_VARARGSACC_TRANSIENT

于 2013-01-05T10:11:54.663 回答