www.pudn.com > ThinkinginJava4thEdition(SourceCode).zip > InterfaceExtractorProcessor.java


//: annotations/InterfaceExtractorProcessor.java 
// APT-based annotation processing. 
// {Exec: apt -factory 
// annotations.InterfaceExtractorProcessorFactory 
// Multiplier.java -s ../annotations} 
package annotations; 
import com.sun.mirror.apt.*; 
import com.sun.mirror.declaration.*; 
import java.io.*; 
import java.util.*; 
 
public class InterfaceExtractorProcessor 
  implements AnnotationProcessor { 
  private final AnnotationProcessorEnvironment env; 
  private ArrayList interfaceMethods = 
    new ArrayList(); 
  public InterfaceExtractorProcessor( 
    AnnotationProcessorEnvironment env) { this.env = env; } 
  public void process() { 
    for(TypeDeclaration typeDecl : 
      env.getSpecifiedTypeDeclarations()) { 
      ExtractInterface annot = 
        typeDecl.getAnnotation(ExtractInterface.class); 
      if(annot == null) 
        break; 
      for(MethodDeclaration m : typeDecl.getMethods()) 
        if(m.getModifiers().contains(Modifier.PUBLIC) && 
           !(m.getModifiers().contains(Modifier.STATIC))) 
          interfaceMethods.add(m); 
      if(interfaceMethods.size() > 0) { 
        try { 
          PrintWriter writer = 
            env.getFiler().createSourceFile(annot.value()); 
          writer.println("package " + 
            typeDecl.getPackage().getQualifiedName() +";"); 
          writer.println("public interface " + 
            annot.value() + " {"); 
          for(MethodDeclaration m : interfaceMethods) { 
            writer.print("  public "); 
            writer.print(m.getReturnType() + " "); 
            writer.print(m.getSimpleName() + " ("); 
            int i = 0; 
            for(ParameterDeclaration parm : 
              m.getParameters()) { 
              writer.print(parm.getType() + " " + 
                parm.getSimpleName()); 
              if(++i < m.getParameters().size()) 
                writer.print(", "); 
            } 
            writer.println(");"); 
          } 
          writer.println("}"); 
          writer.close(); 
        } catch(IOException ioe) { 
          throw new RuntimeException(ioe); 
        } 
      } 
    } 
  } 
} ///:~