在一个Java类java.util.Locale中,我发现关键字transient标记了一个方法。
public final class Locale implements Cloneable, Serializable { private static class LocaleNameGetter implements sun.util.LocaleServiceProviderPool.LocalizedObjectGetter { public transient String getObject(LocaleNameProvider localenameprovider, Locale locale, String s, Object aobj[]) { if(!$assertionsDisabled && aobj.length != 2) throw new AssertionError(); int i = ((Integer)aobj[0]).intValue(); String s1 = (String)aobj[1]; switch(i) { case 0: // '\0' return localenameprovider.getDisplayLanguage(s1, locale); case 1: // '\001' return localenameprovider.getDisplayCountry(s1, locale); case 2: // '\002' return localenameprovider.getDisplayVariant(s1, locale); } if(!$assertionsDisabled) throw new AssertionError(); else return null; }
有人可以告诉我为什么会这样吗?
不,它不能,仅对字段有效。您似乎可以通过反编译从.class获取源代码。这是反编译器错误,如果您查看java.lang.reflect.Modifiersrc,您将看到transient并varargs具有相同的值
java.lang.reflect.Modifier
transient
varargs
public static final int TRANSIENT = 0x00000080; ... static final int VARARGS = 0x00000080;
对于字段0x00000080表示transient,对于方法(您的情况)表示varargs。这就是getObjectjava.util.Locale src中的样子
0x00000080
getObject
public String getObject(LocaleNameProvider localeNameProvider, Locale locale, String key, Object... params) { <-- varargs
在.class(字节码)中,varargs由Object []表示为最后一个参数+修饰符位7 = 1(0x80)。我猜反编译器是旧的,根本不知道varargs哪个是Java 1.5之后的版本,因此将其打印为transient。