2
以下是我在Java 6中的需求:我正在使用Eclipse JUNO。如何編寫註釋處理程序以在Java源程序調用帶註釋的方法時發出警告消息
- 使用自定義註釋來標註方法。
- 在編譯期間,如果方法正在調用 帶註釋的方法,則引發警告消息。
我正在尋找類似@Deprecated註釋的東西。
這是我做了什麼:
- 寫了一個定製的註釋。
- 寫了一個註釋處理器來讀取和處理註釋方法 。
創建一個jar並將其添加到註釋處理器路徑中。我的示例代碼(見下面)在註釋的方法中引發了警告消息。但這不是我的要求。
我不能做什麼:
- 我無法調用方法。我想在這些調用方法中提出警告 消息。
我的示例代碼:
自定義註釋:
package tool.apichecks;
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.METHOD })
public @interface HighCostMethod {
String altMethod();
}
註解處理器:
package tool.apichecks;
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({ "tool.apichecks.HighCostMethod" })
public class MethodProcessor extends AbstractProcessor {
private enum MethodType {
HIGH_COST(HighCostMethod.class.getName());
private String name;
private MethodType(String name) {
this.name = name;
}
private static MethodType getMethodType(String name) {
MethodType methodType = null;
for (MethodType methodType2 : MethodType.values()) {
if (methodType2.name.equals(name)) {
methodType = methodType2;
break;
}
}
return methodType;
}
}
private ProcessingEnvironment processingEnvironment;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
this.processingEnvironment = processingEnvironment;
}
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnvironment) {
if (!roundEnvironment.processingOver()) {
for (TypeElement annotation : annotations) {
final Set<? extends Element> elements = roundEnvironment
.getElementsAnnotatedWith(annotation);
MethodType methodType = MethodType.getMethodType(annotation
.toString());
for (Element element : elements) {
switch (methodType) {
case HIGH_COST: {
processHighCostMethod(element);
break;
}
}
}
}
}
return true;
}
protected void processHighCostMethod(Element element) {
HighCostMethod highCostMethod = element
.getAnnotation(HighCostMethod.class);
/* TODO This warns the annotated method itself. I don't want this. I want to warn the methods that calls this method */
processingEnvironment
.getMessager()
.printMessage(
Kind.WARNING,
String.format(
"Do not use high cost method %s. Instead use %s method.",
element, highCostMethod.altMethod()), element);
}
}
http://stackoverflow.com/questions/1752607/how-to-intentionally-cause-a-custom-java-compiler-warning-message – 18446744073709551615
http://stackoverflow.com/questions/34519957/make-the -java編譯-警告-時-一個註解-方法-是使用的樣棄用 – 18446744073709551615