短暂关键字能标记一个方法吗?

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

有人能告诉我这为什么吗?


1
@user85121,你能提供你看到的链接吗? - Eugene
1
我检查了 JDK 1.6 的源代码,它没有 transient 关键字。 - sanbhat
4
好的,我会尽力进行翻译。以下是需要翻译的内容:Related: https://dev59.com/3G445IYBdhLWcg3wTIZf相关链接:https://dev59.com/3G445IYBdhLWcg3wTIZf - harsh
1
@user85121,你使用的jdk版本是多少?这是一个重要的问题,为了检查特定源代码中发生了什么。如果这段代码是反编译的结果,作者应该已经提到了! - Menelaos
它不在JDK5/6中,可能是在版本之间发布的,或者根本没有。请参见http://javasourcecode.org/html/open-source/jdk/jdk-5.0/java/util/Locale.java.html和http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/util/Locale.java.html。 - harsh
1
似乎作者消失了... :( - Menelaos
6个回答

50

不行,它只对字段有效。你似乎是从反编译的 .class 文件中获取信息。这是反编译器的错误,如果你看一下 java.lang.reflect.Modifier 的源代码,你会发现 transientvarargs 具有相同的值。

public static final int TRANSIENT        = 0x00000080;
...
static final int VARARGS   = 0x00000080;

对于字段,0x00000080表示瞬态,对于方法(您的情况),它表示可变参数。以下是Java.util.Locale源代码中getObject的样子

public String getObject(LocaleNameProvider localeNameProvider,
                        Locale locale, 
                        String key,
                        Object... params) {   <-- varargs

在.class(字节码)中,可变参数由Object[]表示为最后一个参数+修改器位7 = 1(0x80)。我猜反编译器过时了,根本不知道Java 1.5以来的varargs,因此将其打印为transient。


6
如果这段代码已被反编译,那么很可能是由于以下原因:为什么带有可变参数的Java方法被标识为瞬态? 我引用了那里的话:
“在javassist AccessFlag的代码中可以找到一个答案。public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080;它们似乎具有相同的值。由于瞬态对于方法来说没有意义,而对于字段来说可变参数也没有意义,所以它们可以是相同的。”

3

transient只能应用于成员变量,而不能应用于方法,因此存在问题。

从您代码中的变量名称来看 - 诸如String sObject[] aboj之类的内容 - 看起来该源代码是通过反编译相关的.class文件生成的。

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


1
这一定是个bug。或者是某个有bug的版本?transient只能应用于变量。你能提供一个链接吗,让我看看吗?

1
Java文档说明transient关键字仅适用于实例变量,因此这没有任何意义。

0
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    private Boolean  succ;
    private String code;
    private String msg;
    protected T data;

    public Result() {
    }

    public Result(Boolean succ) {
        this.succ = succ;
    }

    
    


    //Can use this here
    @Transient
    public boolean isFail(){
        return !isSucc();
    }
    public boolean isSucc() {
        return succ != null && succ;
    }
}

虽然这段代码可能解决了问题,但是加上说明来阐述如何以及为什么解决了这个问题将有助于提高您的帖子质量,并且可能会得到更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加说明,并给出适用的限制和假设的指示。 - Suraj Rao
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接