son significado reservadas relacionadas que para palabras las identificadores ejemplos cuáles con java transient

java - relacionadas - palabras reservadas y su significado



¿Pueden las palabras clave transitorias marcar un método? (5)

En una clase java java.util.Locale, encuentro que la palabra clave transitoria marcó un método.

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

¿Puede alguien decirme por qué puede ser esto?


Esto tiene que ser un error. ¿O alguna revisión de buggy? Transitorio solo se aplica sobre variables. ¿Puedes proporcionar un enlace donde veas eso?


La documentación de Java indica que la palabra clave transitoria solo se aplica a las variables de instancia, por lo que no tiene ningún sentido


No, no puede, solo es válido para campos. Parece que obtienes tu fuente de .class por descompilación. Este es el error del descompilador, si observa java.lang.reflect.Modifier src verá que transient y varargs tienen el mismo valor

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

para un campo 0x00000080 significa transient , para un método (su caso) significa varargs . Así es como se ve getObject en java.util.Locale src

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

En .class (bytecode) varargs está representado por Object [] como el último parámetro + bit de modificador 7 = 1 (0x80). Supongo que el decompilador es viejo y simplemente no sabe sobre varargs que es desde Java 1.5, por lo que lo imprimió como transient .


Si este código ha sido descompilado es muy probable que sea el resultado de esto: ¿Por qué los métodos Java con varargs identificados como transitorios?

Estoy citando de allí:

El tipo de respuesta se puede encontrar en el código de javassist AccessFlag

public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080; Parece que ambos tienen los mismos valores. Y como transitoria no significa nada para los métodos, mientras que varargs no significa nada para los campos, está bien que sean iguales.


transient solo se puede aplicar a las variables miembro y no a los métodos, por lo que aquí hay un problema.

Al Object[] aboj los nombres de las variables en su código, como String s y Object[] aboj , parece que esta fuente se ha generado al descompilar el archivo .class relevante.

Creo que hay un error en el decompilador que estés usando y que, erróneamente, está agregando transisent a la declaración del método.