猿问

如何故意导致自定义Java编译器警告消息?

我将提交一个丑陋的临时hack,以解决阻塞问题,同时我们等待固定外部资源。除了用一个可怕的注释和一堆FIXME标记它之外,我还希望编译器抛出明显的警告消息作为提醒,所以我们不要忘记将其删除。例如,类似:


[javac] com.foo.Hacky.java:192: warning: FIXME temporary hack to work around library bug, remove me when library is fixed!

有没有一种方法可以通过选择的消息引起故意的编译器警告?失败了,最容易添加到代码中以引发现有警告的东西是什么,可能是在违规行上的字符串中显示了一条消息,以便将其打印在警告消息中?


编辑:不推荐使用的标签似乎对我没有任何帮助:


/**

 * @deprecated "Temporary hack to work around remote server quirks"

 */

@Deprecated

private void doSomeHackyStuff() { ... }

在eclipse中或从sun javac 1.6(从ant脚本运行)中,没有编译器或运行时错误,并且肯定是在执行该功能。


幕布斯6054654
浏览 778回答 3
3回答

皈依舞

我见过的一种技术是将其与单元测试联系起来(您进行单元测试,对吗?)。基本上,您创建一个单元测试,一旦实现外部资源修复,该单元测试就会失败。然后,您对该单元测试发表评论,以告诉其他人,一旦问题解决,如何撤消您的陈旧骇客。这种方法真正令人眼前一亮的是,撤消黑客的诱因是对核心问题本身的修复。

汪汪一只猫

我认为将由编译器处理的自定义批注是解决方案。我经常编写自定义批注以在运行时执行操作,但是我从未尝试在编译时使用它们。因此,我只能为您提供可能需要的工具的指导:编写自定义注释类型。本页说明如何编写注释。编写注释处理器,处理您的自定义注释以发出警告。运行此类注释处理器的工具称为APT。您可以在此页面上找到介绍。我认为您需要在APT API中使用AnnotationProcessorEnvironment,它可以让您发出警告。从Java 6开始,APT已集成到javac中。也就是说,您可以在javac命令行中添加注释处理器。javac手册的这一部分将告诉您如何调用自定义注释处理器。我不知道这种解决方案是否切实可行。我会在有空的时候尝试自己实现它。编辑我成功实现了我的解决方案。另外,我使用了Java的服务提供商功能来简化其使用。实际上,我的解决方案是一个jar,其中包含2个类:自定义注释和注释处理器。要使用它,只需将此jar添加到项目的类路径中,然后注释任何内容即可!就在我的IDE(NetBeans)内部,这工作正常。注释代码:package fr.barjak.hack;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.SOURCE)@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})public @interface Hack {}处理器代码:package fr.barjak.hack_processor;import java.util.Set;import javax.annotation.processing.AbstractProcessor;import javax.annotation.processing.ProcessingEnvironment;import javax.annotation.processing.RoundEnvironment;import javax.annotation.processing.SupportedAnnotationTypes;import javax.lang.model.element.Element;import javax.lang.model.element.TypeElement;import javax.tools.Diagnostic.Kind;@SupportedAnnotationTypes("fr.barjak.hack.Hack")public class Processor extends AbstractProcessor {&nbsp; &nbsp; private ProcessingEnvironment env;&nbsp; &nbsp; @Override&nbsp; &nbsp; public synchronized void init(ProcessingEnvironment pe) {&nbsp; &nbsp; &nbsp; &nbsp; this.env = pe;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {&nbsp; &nbsp; &nbsp; &nbsp; if (!roundEnv.processingOver()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (TypeElement te : annotations) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (Element elt : elts) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; env.getMessager().printMessage(Kind.WARNING,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elt);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; }}要将生成的jar作为服务提供者启用,请在jar中添加文件META-INF/services/javax.annotation.processing.Processor。此文件是acsii文件,必须包含以下文本:fr.barjak.hack_processor.Processor

长风秋雁

一些快速且不太脏的方法可能是使用@SuppressWarnings带有故意错误String参数的注释:@SuppressWarnings("FIXME: this is a hack and should be fixed.")这将生成警告,因为编译器未将其识别为特定的警告,以禁止执行以下操作:不支持的@SuppressWarnings(“ FIXME:这是一个hack,应该修复。”)
随时随地看视频慕课网APP

相关分类

Java
我要回答