'volatile' в сигнатуре метода? [Дубликат]

This question already has an answer here:

Why make a method volatile in java? 7 answers

Это странно У меня есть следующий код:

<code>class A
{   
    protected A clone() throws CloneNotSupportedException
    {
        return (A) super.clone();       
    }
}
</code>

когда я декомпилировал его байт-код через «showmycode.com», он показал мне следующий код:

<code>class A
{

    A()
    {
    }

    protected A clone()
    throws clonenotsupportedexception
    {
        return (A)super.clone();
    }

    protected volatile object clone()
    throws clonenotsupportedexception
    {
        return clone();
    }
}
</code>

Что означает, что тип возвращаемого метода должен быть изменчивым во втором «клоне»? метод? (Этот код был скомпилирован с помощью стандартного компилятора JDK 1.6 Eclipse).

 Kai Sternad29 апр. 2012 г., 08:05
Я думаю, что этот ответ применим здесь:stackoverflow.com/questions/6651867/…
 shrini100029 апр. 2012 г., 08:07
@ Бантинг, спасибо. Не могли бы вы пож. упомянуть это в своем ответе, чтобы я мог принять это?

Ответы на вопрос(4)

Это ничего не значит. Это ошибка в декомпиляторе. Конец истории.

(Ошибка, вероятно, связана с тем фактом, что определенные биты флага, используемые в формате файла класса, являются «перегруженными», что означает разные вещи в контексте класса, поля или метода. Я также смутно напоминаю, что были некоторые & quot; новые применения & quot; в последних редакциях спецификаций JVM.)

Это ошибка в вашем декомпиляторе.

volatile только допустимый модификатор для поля.

Я рекомендую вам прочитатьэтот aricle.

 29 апр. 2012 г., 08:23
@ shrini1000, попробуйте скомпилировать декомпилированный код - вы увидите, что он не компилируется. В Java вы не можете пометить метод с помощью модификатора volatile. Я думаю, что это ошибка инструмента, который вы используете для декомпиляции.
 shrini100029 апр. 2012 г., 08:00
Я это понимаю. У меня вопрос: почему декомпилированный код имеет «volatile»? в сигнатуре методаwhen the original code doesn't? Кажется, что только методы моста показывают этот симптом.

Этот ответ уже был рассмотрен в вопросеЗачем делать метод изменчивым в Java?  Но вот еще немного информации.

Когда вы перегружаете методы (возможно, только универсальные методы в суперклассе), метод помечается как«Мостовой метод», Отjava.lang.reflect.Modifier:

static final int BRIDGE    = 0x00000040;

К сожалению, это тот же бит, который используется для пометки полей какvolatile:

public static final int VOLATILE         = 0x00000040;

Если вы напечатаете модификаторы для этого метода, вы увидите что-то вроде:

public volatile

Это ограничение вModifiers.toString(int) метод, который не знает, является ли это полем или методом.

public static String toString(int mod) {
    StringBuffer sb = new StringBuffer();
    ...
    if ((mod & VOLATILE) != 0)  sb.append("volatile ");
    // no mention of BRIDGE here
    ...
    return sb.toString().substring(0, len-1);
}
Решение Вопроса

Маска модификатора для полей и методов похожа, но не совсем одинакова. Декомпилятор, скорее всего, используетtoString метод здесь

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/reflect/Modifier.java

но он не обрабатывает все биты

// Bits not (yet) exposed in the public API either because they
// have different meanings for fields and methods and there is no
// way to distinguish between the two in this class, or because
// they are not Java programming language keywords

То, что он не обрабатывает, это биты, которые могут означатьsynthetic а такжеbridge которые идентифицируют сгенерированный компилятором код.

Еслиvolatile здесь означает что-либо вообще, это может означать, что метод не удаляется, даже если он ничего не делает.

 18 авг. 2016 г., 17:08
Это не ошибка. Кажется, что сгенерированные методы, которые требуются для обобщенных типов и вставляются в скомпилированные классы, помечаются как «volatile», даже если это не является их точным значением.

Ваш ответ на вопрос