为什么带有varargs的Java方法被识别为瞬态?

Ahm*_*gle 21 java reflection jls

我正在使用Java Reflection API,并观察到具有可变参数列表的方法变得短暂.为什么这个以及transient关键字在这种情况下意味着什么?

来自Java Glossary,transient:

Java编程语言中的关键字,指示字段不是对象的序列化形式的一部分.当对象被序列化时,其瞬态字段的值不包括在串行表示中,而其非瞬态字段的值包括在内.

然而,这个定义并未说明方法.有任何想法吗?

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Dummy {
    public static void main(String[] args) {
        for(Method m : Dummy.class.getDeclaredMethods()){
            System.out.println(m.getName() + " --> "+Modifier.toString(m.getModifiers()));
        }
    }

    public static void foo(int... args){}
}
Run Code Online (Sandbox Code Playgroud)

输出:

main --> public static
foo --> public static transient
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 22

可以在javassist的代码中找到答案的排序AccessFlag

public static final int TRANSIENT = 0x0080;
public static final int VARARGS   = 0x0080;
Run Code Online (Sandbox Code Playgroud)

它似乎都具有相同的值.而且因为transient对方法没有任何意义,而varargs对于字段没有任何意义,它们可以是相同的.

但是,Modifier班级不考虑这一点是不行的.我提出了一个问题.它需要一个新的常量 - VARARGS一个新的方法 - isVarargs(..).并且toString()可以重写该方法以包括"transient/varargs".

  • modifier.toString()接受一个int,并从那里获取它; 由于没有差异字段/方法,它永远不会是正确的 (2认同)

tem*_*def 6

这看起来像是实现中的错误.我认为根本原因可能是.class文件中为瞬态字段设置的位对于varargs方法是相同的(请参阅http://java.sun.com/docs/books/jvms/second_edition/ClassFileFormat-Java5. pdf,第122和119页).