//: 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); } } } } } ///:~