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

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

4

6 回答 6

50

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

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

对于一个字段0x00000080意味着transient,对于一个方法(你的情况)它意味着varargs。这就是getObjectjava.util.Locale src 中的样子

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

在 .class(字节码)中,可变参数由 Object[] 表示为最后一个参数 + 修饰符位 7 = 1 (0x80)。我猜反编译器很旧,根本不知道varargs哪个是自 Java 1.5 以来的,所以它打印为transient.

于 2013-04-26T10:20:53.517 回答
6

如果这段代码已经被反编译,很可能是这样的结果:为什么带有可变参数的 Java 方法被识别为瞬态?

我从那里引用:

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

公共静态最终int TRANSIENT = 0x0080;公共静态最终 int VARARGS = 0x0080; 看起来两者具有相同的值。由于瞬态对方法没有任何意义,而可变参数对字段没有任何意义,因此它们相同是可以的。

于 2013-04-26T10:22:03.697 回答
3

transient只能应用于成员变量,不能应用于方法,所以这里有问题。

查看代码中的变量名称 - 诸如String sObject[] aboj- 看起来这个源代码是通过反编译相关.class文件生成的。

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

于 2013-04-26T10:20:46.410 回答
1

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

于 2013-04-26T10:16:30.190 回答
1

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

于 2013-04-26T10:18:16.790 回答
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;
    }
}
于 2021-10-12T07:17:05.240 回答