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.