2012-11-02 40 views
2

以下是我在Java 6中的需求:我正在使用Eclipse JUNO。如何編寫註釋處理程序以在Java源程序調用帶註釋的方法時發出警告消息

  1. 使用自定義註釋來標註方法。
  2. 在編譯期間,如果方法正在調用 帶註釋的方法,則引發警告消息。

我正在尋找類似@Deprecated註釋的東西。

這是我做了什麼:

  1. 寫了一個定製的註釋。
  2. 寫了一個註釋處理器來讀取和處理註釋方法 。

創建一個jar並將其添加到註釋處理器路徑中。我的示例代碼(見下面)在註釋的方法中引發了警告消息。但這不是我的要求。

我不能做什麼:

  1. 我無法調用方法。我想在這些調用方法中提出警告 消息。

我的示例代碼:

自定義註釋:

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); 
    } 

} 
+0

http://stackoverflow.com/questions/1752607/how-to-intentionally-cause-a-custom-java-compiler-warning-message – 18446744073709551615

+0

http://stackoverflow.com/questions/34519957/make-the -java編譯-警告-時-一個註解-方法-是使用的樣棄用 – 18446744073709551615

回答

0

使用的AnnotationProcessor將只包含註釋的文件或壓倒一切的方法工作,但不能調用方法。也許有一種解決方法,但是你可能會受到項目的限制,因爲處理器一次只能看一個項目。

我想你需要用一個構建器編寫一個Eclipse插件,它分析所有文件中的代碼並檢查稱爲方法的註釋。 比註釋處理器有更多的工作,但是你也有更多的選擇。例如。您可以實現錯誤標記的快速修復。

相關問題