Javac не генерирует warning на @Deprecated

90
15 октября 2019, 02:00

Компилирую такой код

public class MyClass {
    /**
        An entry point for entire program
        @param args command line arguments
        @version 1.0 SNAPSHOT
        @see <a href='https://www.google.com'>google.com</a>
    */
    public static void main(String[] args) {
        System.out.println("Starting ...");
        printHelloWorld();
    }
    @Deprecated()
    public static void printHelloWorld() {
        System.out.println("Hello world!");
    }
}

командой javac MyClass.java. Версия компилятора 11.0.2.

Однако никаких сообщений о использовании deprecated метода не получаю. Компилируется без всяких сообщений. После декомпиляции полученного class-файла получаю

import java.io.PrintStream;
public class MyClass
{
    public MyClass()
    {
    }
    public static void main(String args[])
    {
        System.out.println("Starting ...");
        printHelloWorld();
    }
    /**
     * @deprecated Method printHelloWorld is deprecated
     */
    public static void printHelloWorld()
    {
        System.out.println("Hello world!");
    }
}

Аннотация @Deprecated превратилась в тег javadoc-a. Тоже немного непонятно почему. Если это сделал декомпилятор из-за наличия аннотации, то почему он её саму убрал? Декомпилировал с помощью jad.

Почему компилятор не выдает предупреждений?

Answer 1

Однако никаких сообщений о использовании deprecated метода не получаю.

Попробуйте вынести метод printHelloWorld в другой класс и использовать его. Тогда предупреждение появится. Пометка об устаревании имеет смысл только в отношении публичного API, а не к использованию классом своих собственных методов.

Аннотация @Deprecated превратилась в тег javadoc-a. Тоже немного непонятно почему. Если это сделал декомпилятор из-за наличия аннотации, то почему он её саму убрал?

Вероятно ваш декомпилятор её теряет, так как в байткоде она остаётся:

  public static void printHelloWorld();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=0, args_size=0
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String Hello world!
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 63: 0
        line 64: 8
    Deprecated: true
    RuntimeVisibleAnnotations:
      0: #18()                                // Ljava/lang/Deprecated;
READ ALSO
Что такое lazy и eager операторы?

Что такое lazy и eager операторы?

При изучении Stream API, часто встречал употребление выражений lazy и eager операторы, но нигде толком не мог найти нормальное определение этих понятий

111
Java, SpringMVC, Forbidden403, при добавлении в базу данных

Java, SpringMVC, Forbidden403, при добавлении в базу данных

Только начала разбираться со SpringПытаюсь добавить данные в БД и отобразить их списком на страничке

97
Использование web-страниц в JavaFX приложении

Использование web-страниц в JavaFX приложении

Передо мной предстала следующая задача: написать некоторый софт на Java, с применением GUI на JavaFXодной из функций будущей программы должна быть...

129
Обновление списка в RecyclerView

Обновление списка в RecyclerView

Для обновления списка в RecyclerView знаю три способа

169