Могут ли временные ключевые слова отмечать метод?
В 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
Нет, он не может, он действителен только для полей. Кажется, вы получаете свой источник из .class путем декомпиляции. Это ошибка декомпилятора, если вы посмотрите на java.lang.reflect.Modifier
src, вы увидите, что transient
и varargs
имеют одинаковое значение
public static final int TRANSIENT = 0x00000080;
...
static final int VARARGS = 0x00000080;
для поля 0x00000080
означает transient
, для метода (ваш случай) это означает varargs
. Вот как выглядит getObject
в java.util.Locale src
public String getObject(LocaleNameProvider localeNameProvider,
Locale locale,
String key,
Object... params) { <-- varargs
В .class(байт-код) varargs представлен объектом Object [] в качестве последнего параметра + бит модификатора 7 = 1 (0x80). Я думаю, что декомпилятор устарел и просто не знает о varargs
, который с тех пор, как Java 1.5, напечатал его как transient
.
Ответ 2
Если этот код был декомпилирован, скорее всего, это результат: Почему Java-методы с varargs идентифицированы как переходные?
Я цитирую оттуда:
Отклик ответа можно найти в коде javassist AccessFlag
public static final int TRANSIENT = 0x0080; public static final int VARARGS = 0x0080; Кажется, оба имеют одинаковые значения. И с тех пор переходный метод ничего не значит для методов, в то время как varargs ничего не значит для поля, это нормально для них, чтобы они были одинаковыми.
Ответ 3
transient
может применяться только к переменным-членам, а не к методам, поэтому здесь есть проблема.
Взгляд на имена переменных в вашем коде - такие вещи, как String s
и Object[] aboj
- похоже, что этот источник был сгенерирован путем декомпиляции соответствующего файла .class
.
Я думаю, что есть ошибка в том, какой декомпилятор вы используете, который ошибочно добавляет transisent
к объявлению метода.
Ответ 4
В документации на Java указано, что ключевое слово переходного процесса применяется только к переменным экземпляра, поэтому это не имеет никакого смысла
Ответ 5
Это должно быть ошибкой. Или какая-то ошибка? переходный применяется только к переменным. Можете ли вы предоставить ссылку, где вы видите это?