Подтвердить что ты не робот

Могут ли временные ключевые слова отмечать метод?

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

Может кто-нибудь сказать мне, почему это может быть?

4b9b3361

Ответ 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

Это должно быть ошибкой. Или какая-то ошибка? переходный применяется только к переменным. Можете ли вы предоставить ссылку, где вы видите это?