为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2019-11-25 11:10:08
我将提交一个丑陋的临时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" */@Deprecatedprivate void doSomeHackyStuff() { ... }在eclipse中或从sun javac 1.6(从ant脚本运行)中,没有编译器或运行时错误,并且肯定是在执行该功能。
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

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

这种方法真正令人眼前一亮的是,撤消黑客的诱因是对核心问题本身的修复。


查看完整回答
反对 回复 2019-11-25
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我认为将由编译器处理的自定义批注是解决方案。我经常编写自定义批注以在运行时执行操作,但是我从未尝试在编译时使用它们。因此,我只能为您提供可能需要的工具的指导:


编写自定义注释类型。本页说明如何编写注释。

编写注释处理器,处理您的自定义注释以发出警告。运行此类注释处理器的工具称为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 {


    private ProcessingEnvironment env;


    @Override

    public synchronized void init(ProcessingEnvironment pe) {

        this.env = pe;

    }


    @Override

    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

        if (!roundEnv.processingOver()) {

            for (TypeElement te : annotations) {

                final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);

                for (Element elt : elts) {

                    env.getMessager().printMessage(Kind.WARNING,

                            String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),

                            elt);

                }

            }

        }

        return true;

    }


}

要将生成的jar作为服务提供者启用,请在jar中添加文件META-INF/services/javax.annotation.processing.Processor。此文件是acsii文件,必须包含以下文本:


fr.barjak.hack_processor.Processor


查看完整回答
反对 回复 2019-11-25
?
长风秋雁

TA贡献1757条经验 获得超7个赞

一些快速且不太脏的方法可能是使用@SuppressWarnings带有故意错误String参数的注释:


@SuppressWarnings("FIXME: this is a hack and should be fixed.")

这将生成警告,因为编译器未将其识别为特定的警告,以禁止执行以下操作:


不支持的@SuppressWarnings(“ FIXME:这是一个hack,应该修复。”)


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 777 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信