Будет ли JVM выдавать предупреждение во время выполнения для использования кодов @deprecated? - PullRequest
3 голосов
/ 10 ноября 2011

Будет ли JVM выдавать предупреждение во время выполнения для использования кодов @deprecated?

Если нет, могу ли я предупредить об использовании кодов @deprecated?

Ответы [ 5 ]

4 голосов
/ 10 ноября 2011

Будет ли JVM выдавать предупреждение во время выполнения для использования кодов @deprecated?

Нет.

Если это не так, могу ли я сделать это для предупрежденияиспользование кодов @deprecated?

Не знаю, о чем я знаю.


OTOH можно узнать в коде во время выполнения, если определенный элемент устарел:

import java.awt.Panel;
import java.lang.reflect.Method;
import java.lang.annotation.Annotation;

class TestAnnotations {

    @Deprecated
    public Object getStuff() {
        return null;
    }

    public static void showAnnotations(
        Object obj,
        String methodName) throws Exception {

        Class cls = obj.getClass();
        Method m = cls.getMethod(methodName);
        System.out.println(m);
        Annotation[] as = m.getDeclaredAnnotations();
        for (Annotation a : as) {
            System.out.println(a);
        }
    }

    public static void main(String[] args) throws Exception {
        Panel p = new Panel();
        showAnnotations(p, "show");

        TestAnnotations ta = new TestAnnotations();
        showAnnotations(ta, "getStuff");
    }
}

Вывод

public void java.awt.Component.show()
@java.lang.Deprecated()
public java.lang.Object TestAnnotations.getStuff()
@java.lang.Deprecated()
Press any key to continue . . .
2 голосов
/ 10 ноября 2011

Будет ли JVM выдавать предупреждение во время выполнения для использования кодов @deprecated?

Нет, оно не предупредит вас.

Если это не так,можно ли предупредить об использовании кодов @deprecated?

На практике нет.

Я полагаю, теоретически возможно заставить VVM сделать это, внедрив собственный загрузчик классов ипарсинг файлов классов вручную для извлечения и проверки «устаревших» атрибутов всех используемых методов.Тем не менее, это было бы очень много работы, потому что вам нужно было бы повторить большую часть логики синтаксического анализа и проверки, которая происходит под капотом в обычном загрузчике классов.Это также (я думаю) потребовало бы от вас изменить загрузочный путь JVM, чтобы ваш загрузчик классов использовался для всего.Поэтому, даже если это возможно, это действительно плохая идея. Комментарий


@ prunge предлагает альтернативу, которая будет проще в реализации ... и более "кошерной" ... но все же нелегкое задание.

1 голос
/ 10 ноября 2011

Нет, и вы не должны этого делать.С кодом @Deprecated все в порядке.Это просто подсказка поставщика библиотеки о том, что код / ​​метод / класс больше не является рекомендуемым способом выполнения каких-либо действий и может выпасть из срока службы.У большинства проектов с открытым исходным кодом будет определенное правило для расписания, по которому код может быть помечен как устаревший, а затем удален.Обычно я видел 1 основной выпуск для устаревания и удаления в следующем основном выпуске.

0 голосов
/ 10 ноября 2011

Нет, аннотации недоступны во время выполнения (такая информация не будет встроена в байт-код)

это всего лишь инструкции для компилятора. Компилятор предупреждает программиста (если он не подавлен), что существуют лучшие реализации и не используются методы, которые не рекомендуются (то есть помечены как @deprecated)

0 голосов
/ 10 ноября 2011

Надлежащим образом следует учитывать предупреждения об устаревании, которые выдаются при компиляции кода.Они там по причине.В большинстве случаев вы можете довольно легко узнать, как обновить код, прочитав прекрасное руководство, и тогда вам вообще не нужно беспокоиться о запуске устаревшего кода.

...