JVM是否会在运行时使用@deprecated代码发出警告?

时间:2011-11-10 02:54:03

标签: java deprecated

JVM是否会在运行时使用@deprecated代码发出警告?

如果没有,我可以使用@deprecated代码警告它吗?

5 个答案:

答案 0 :(得分:4)

  

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 . . .

答案 1 :(得分:2)

  

JVM是否会在运行时使用@deprecated代码发出警告?

不,它不会警告你。

  

如果没有,我可以使用@deprecated代码警告它吗?

在实践中,没有。

我想理论上可以让VVM通过实现自己的类加载器并手动解析类文件来提取和检查所有使用的方法的“不赞成”属性。但是,这将是一项非常多的工作,因为您需要复制大部分解析和检查逻辑,这些逻辑发生在普通类加载器的引擎盖下。它(我认为)还要求您修改JVM的bootclasspath以使您的类加载器用于所有内容。所以即使这是可能的,这也是一个非常糟糕的主意。


@ prunge的评论提出了一个更容易实现的替代方案......更多的“犹太教”......但仍然不是一件容易的事。

答案 2 :(得分:1)

不,你不应该这样做。 @Deprecated代码没有任何问题。这只是图书馆提供者的一个提示,即代码/方法/类不再是推荐的做事方式,可能会超出使用寿命。大多数开源项目都会有一个已定义的计划规则,通过该计划可以将代码标记为已弃用然后删除。我通常会在随后的主要版本中看到1个主要版本的弃用和删除。

答案 3 :(得分:0)

正确的做法是注意编译代码时发出的弃用警告。他们是有原因的。大多数情况下,您可以通过阅读精细手册轻松了解如何更新代码,然后您根本不必担心运行已弃用的代码。

答案 4 :(得分:0)

不,注释在运行时不可用(这些信息不会嵌入到字节码中)

它们只是编译器的指令。编译器向程序员发出警告(如果没有被抑制),存在更好的实现。不要使用已弃用的方法(即标记为@deprecated)