为什么使用 varargs 的 Java 方法被标识为瞬态?

2022-09-02 03:47:13

我正在玩Java Reflection API,并观察到具有可变参数列表的方法变得瞬态。为什么会这样,关键字在这种情况下意味着什么?transient

来自 Java 词汇表,瞬态

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){}
}

输出:

main --> public static
foo --> public static transient

答案 1

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

public static final int TRANSIENT = 0x0080;
public static final int VARARGS   = 0x0080;

两者似乎具有相同的值。由于对方法没有任何意义,而 varargs 对字段没有任何意义,因此它们可以相同。transient

但是,班级不考虑这一点是不对的。我会提出一个关于它的问题。它需要一个新的常量 - 和一个新的方法 - 。该方法可以重写以包含“瞬态/”。ModifierVARARGSisVarargs(..)toString()


答案 2

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