Can transient keywords mark a method?

前端 未结 5 964
小鲜肉
小鲜肉 2021-02-01 17:45

In a java class java.util.Locale, I find that the keyword transient marked a method.

 public final class Locale
    implements Cloneable, Serializable
{
    priv         


        
相关标签:
5条回答
  • 2021-02-01 17:59

    No it can't, it's only valid for fields. You seem to get your source from .class by decompiling. This is the decompiler bug, if you take a look at java.lang.reflect.Modifier src you will see that transient and varargs have the same value

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

    for a field 0x00000080 means transient, for a method (your case) it means varargs. This is how getObject looks like in java.util.Locale src

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

    In .class (bytecode) varargs is represented by Object[] as the last parameter + modifier bit 7 = 1 (0x80). I guess the decompiler is old and simply does not know about varargs which is since Java 1.5 so it printed it as transient.

    0 讨论(0)
  • 2021-02-01 17:59

    Java documentation states that transient keyword is only applied to instance variables so this doesn´t make any sense

    0 讨论(0)
  • 2021-02-01 18:09

    If this code has been decompiled it is most likely a result of this: Why Java methods with varargs identified as transient?

    I am quoting from there:

    Sort of an answer can be found in the code of javassist AccessFlag

    public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080; It appears both have the same values. And since transient means nothing for methods, while varargs means nothing for fields, it is ok for them to be the same.

    0 讨论(0)
  • 2021-02-01 18:14

    transient can only be applied to member variables and not to methods so there is a problem here.

    Looking at the variable names in your code - things like String s and Object[] aboj - it looks like this source has been generated by decompiling the relevant .class file.

    I think there is a bug in whichever decompiler you're using which is erroneously adding transisent to the method declaration.

    0 讨论(0)
  • 2021-02-01 18:15

    This has to be a bug. Or some buggy revision? transient is only applied on variables. Can you provide a link where you see that?

    0 讨论(0)
提交回复
热议问题