在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;
}
有人可以告诉我为什么会这样吗?
答案 0 :(得分:46)
不,它不能,它只对字段有效。您似乎通过反编译从.class获取源代码。这是反编译错误,如果您查看java.lang.reflect.Modifier
src,您会看到transient
和varargs
具有相同的值
public static final int TRANSIENT = 0x00000080;
...
static final int VARARGS = 0x00000080;
字段0x00000080
的表示transient
,对于方法(您的情况),它表示varargs
。这就是getObject
在java.util.Locale src
public String getObject(LocaleNameProvider localeNameProvider,
Locale locale,
String key,
Object... params) { <-- varargs
在.class(字节码)中,varargs由Object []表示为最后一个参数+修饰符bit 7 = 1(0x80)。我想反编译器是旧的,根本不知道自Java 1.5以来的varargs
所以它将它打印为transient
。
答案 1 :(得分:6)
如果此代码已经过反编译,则很可能是这样的结果:Why Java methods with varargs identified as transient?
我从那里引用:
答案的排序可以在javassist AccessFlag
的代码中找到public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080;它看起来都有相同的值。从那以后 瞬态对方法毫无意义,而varargs对于方法毫无意义 字段,它们可以是相同的。
答案 2 :(得分:3)
transient
只能应用于成员变量而不能应用于方法,因此这里存在问题。
查看代码中的变量名称 - 例如String s
和Object[] aboj
- 看起来这个源是通过反编译相关的.class
文件生成的。
我认为您使用的反编译器中存在一个错误,即错误地将transisent
添加到方法声明中。
答案 3 :(得分:1)
Java文档指出,transient关键字仅应用于实例变量,因此没有任何意义
答案 4 :(得分:0)
这必须是一个错误。还是一些错误的修改?瞬态仅适用于变量。你能提供一个你看到的链接吗?