瞬态关键字可以标记方法吗?

时间:2013-04-26 10:09:35

标签: java transient

在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;
        }

有人可以告诉我为什么会这样吗?

5 个答案:

答案 0 :(得分:46)

不,它不能,它只对字段有效。您似乎通过反编译从.class获取源代码。这是反编译错误,如果您查看java.lang.reflect.Modifier src,您会看到transientvarargs具有相同的值

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 sObject[] aboj - 看起来这个源是通过反编译相关的.class文件生成的。

我认为您使用的反编译器中存在一个错误,即错误地将transisent添加到方法声明中。

答案 3 :(得分:1)

Java文档指出,transient关键字仅应用于实例变量,因此没有任何意义

答案 4 :(得分:0)

这必须是一个错误。还是一些错误的修改?瞬态仅适用于变量。你能提供一个你看到的链接吗?

相关问题