3 回答
TA贡献1851条经验 获得超3个赞
我见过的一种技术是将其与单元测试联系起来(您进行单元测试,对吗?)。基本上,您创建一个单元测试,一旦实现外部资源修复,该单元测试就会失败。然后,您对该单元测试发表评论,以告诉其他人,一旦问题解决,如何撤消您的陈旧骇客。
这种方法真正令人眼前一亮的是,撤消黑客的诱因是对核心问题本身的修复。
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
TA贡献1757条经验 获得超7个赞
一些快速且不太脏的方法可能是使用@SuppressWarnings带有故意错误String参数的注释:
@SuppressWarnings("FIXME: this is a hack and should be fixed.")
这将生成警告,因为编译器未将其识别为特定的警告,以禁止执行以下操作:
不支持的@SuppressWarnings(“ FIXME:这是一个hack,应该修复。”)
添加回答
举报