Java 如何在自己的API中发出警告消息?

Java 如何在自己的API中发出警告消息?,java,eclipse,compiler-warnings,Java,Eclipse,Compiler Warnings,是否可以在我自己的API中提供自定义警告消息,如下所示?是否资源泄漏:'ois'从未关闭消息与Java API或JVM相关 我相信它与EclipseIDE有关,您可以编写一个插件来显示这样的警告 例如,当您使用注释为“@Deprecated”的方法时,ide会自动告诉程序员该方法已弃用。您可以使用注释创建警告、注释、错误和其他类似的诊断消息。它是一个集成在JDK中的编译器插件api。它允许您分析源代码的概要结构。尽管名称不同,但在处理代码时实际上不需要处理任何注释。消息是使用类创建的。如果您提供

是否可以在我自己的API中提供自定义警告消息,如下所示?是否
资源泄漏:'ois'从未关闭
消息与Java API或JVM相关


我相信它与EclipseIDE有关,您可以编写一个插件来显示这样的警告


例如,当您使用注释为“@Deprecated”的方法时,ide会自动告诉程序员该方法已弃用。

您可以使用注释创建警告、注释、错误和其他类似的诊断消息。它是一个集成在JDK中的编译器插件api。它允许您分析源代码的概要结构。尽管名称不同,但在处理代码时实际上不需要处理任何注释。消息是使用类创建的。如果您提供一个元素,它将被标记,并且消息将在源代码编辑器中显示在它旁边

不过,您不能在方法或表达式中的元素上显示消息,只能在类型、属性、方法或参数等声明上显示消息。可以使用其他工具额外解析方法体并基于内容生成消息,但据我所知,您无法在实际的本地元素上显示消息。您仍然可以在封闭方法上显示消息,或者根本不指定任何元素,而是在IDE的日志中显示它


IDE也需要支持这一点。我知道Eclipse和NetBeans确实支持由注释处理器生成的消息,但可能还有其他现代IDE也支持这样做。如果您需要更多的特性,如方法体内部元素上的消息或示例中所示的快速修复特性,我想您需要为IDE创建一个插件

使用编译器API是可能的。您必须扩展抽象处理器,然后确保编译器知道它

假设我们不喜欢程序员在源代码中骂人。所以,当有人定义一个名为“狗屎”的字段时,我们想要显示一个警告。下面是一个简单的实现:

import java.util.List;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;

@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedAnnotationTypes("*")
public class Test extends AbstractProcessor {
    public int shit;
    public int foo;

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        Set<? extends Element> rootElements = roundEnv.getRootElements();

        for (Element element : rootElements) {
            if (element.getKind() == ElementKind.CLASS) {
                List<? extends Element> classElements = element.getEnclosedElements();

                for (Element classElement : classElements) {
                    if (classElement.getKind() == ElementKind.FIELD) {
                        if (classElement.getSimpleName().contentEquals("shit")) {
                            processingEnv.getMessager().printMessage(
                                Kind.WARNING,
                                "How dare you to swear in the source code?!",
                                classElement
                            );
                        }
                    }
                }
            }
        }

        return false;
    }

    public static void main(String[] args) {
        //
    }
}
我们需要首先构建一个处理器,然后在编译时应用它(在本例中是对同一个文件)

这是我们得到的输出:

Test.java:17: warning: How dare you to swear in the source code?!
    public int shit;
           ^
1 warning
要在Eclipse或任何其他IDE中具有相同的警告,必须更改编译器设置,使其使用此自定义处理器

更新:在评论中,kapep发送了一个关于如何在Eclipse中设置自定义处理器的链接:


仅供记录:通过实现接口可关闭,可以实现完全相同的警告:

import java.io.Closeable;
import java.io.IOException;

public class Test implements Closeable {
    @Override
    public void close() throws IOException {
        // TODO Auto-generated method stub
    }

    public static void main(String[] args) {
        new Test();
    }
}
你会看到同样的警告:


与此类似,这是我一直想给予的;其中两个方法必须一起重写,类似于equals和andhashcode@CanMingir那一个来自编译器。如果你想要一个自定义注释,那么自定义注释如何:我认为这来自IDE-这里是eclipseMaybe,你可以使用自定义
异常
s来实现它?很好的更新答案,尽管合并亵渎并不是特别必要+1在eclipse中设置处理器有点复杂。您需要使用一些元资源创建一个jar,并激活一些设置。这里有一个教程:(对较新版本的java仍然有效)谢谢,我知道JAR,但不知道其余的事情。我更新了我的答案。@tzima你能详细说明界面
Closeable
与答案有什么关系吗?为什么特定的接口会引发警告?它不包含“狗屎”这个词。@Vulcan我想添加一些例子,但对我来说似乎有点超出范围,因为这个问题相当广泛,所以我试着给出一个可能的概述。现在,另一个答案已经用一个很好的例子更新了,我想这就足够了。
import java.io.Closeable;
import java.io.IOException;

public class Test implements Closeable {
    @Override
    public void close() throws IOException {
        // TODO Auto-generated method stub
    }

    public static void main(String[] args) {
        new Test();
    }
}