我寫THI註釋定義註解處理器
@Retention(RetentionPolicy.SOURCE)
public @interface Encrypt {
}
和它的處理器...
@SupportedAnnotationTypes("it.trecube.annotation.Encrypt")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class EncryptProcessor extends AbstractProcessor{
public EncryptProcessor(){
super();
}
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
String className = null;
String packageName = null;
String fqClassName = null;
for (Element elem : roundEnv.getElementsAnnotatedWith(Encrypt.class)) {
if (elem.getKind() == ElementKind.CLASS) {
// Encrypt encrypt = elem.getAnnotation(Encrypt.class);
// String message = "annotation found in " + elem.getSimpleName();
// processingEnv.getMessager().printMessage(Kind.NOTE, message);
TypeElement classElement = (TypeElement) elem;
PackageElement packageElement = (PackageElement) classElement.getEnclosingElement();
processingEnv.getMessager().printMessage(
Diagnostic.Kind.NOTE,
"annotated class: @Encrypt" , elem);
className = classElement.getSimpleName().toString();
packageName = packageElement.getQualifiedName().toString();
fqClassName = classElement.getQualifiedName().toString();
if (fqClassName != null) {
processingEnv.getMessager().printMessage(
Diagnostic.Kind.NOTE,
"fqClassName: "+fqClassName , elem);
Properties props = new Properties();
URL url = this.getClass().getClassLoader().getResource("velocity.properties");
try {
props.load(url.openStream());
} catch (IOException e) {
processingEnv.getMessager().printMessage(
Diagnostic.Kind.ERROR,
"annotated class: " + classElement.getQualifiedName()+"->\n"+
e.getMessage(), elem);
e.printStackTrace();
return true;
}
VelocityEngine ve = new VelocityEngine(props);
ve.init();
VelocityContext vc = new VelocityContext();
vc.put("className", className);
vc.put("packageName", packageName);
Template vt = ve.getTemplate("encrypt.vm");
File file = new File("src/main/java/"+fqClassName.replace(".", "/")+"_Encrypt.aj");
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
processingEnv.getMessager().printMessage(
Diagnostic.Kind.NOTE,
"creating source file: " + file.getAbsolutePath());
processingEnv.getMessager().printMessage(
Diagnostic.Kind.NOTE,
"applying velocity template: " + vt.getName());
vt.merge(vc, bw);
bw.close();
} catch (IOException e) {
processingEnv.getMessager().printMessage(
Diagnostic.Kind.ERROR,
"applying velocity error: " + vt.getName()+"->\n"+e.getMessage());
e.printStackTrace();
}
}
}
}
return true; // no further processing of this annotation type
}
我測試過的所有成行家客戶項目和所有的工作,但是當我嘗試使用它到現有的春天(完整的maven構建)項目不工作... 有人可以幫助我嗎? Tnx
說,這是行不通的,當你能更具體?你面臨哪個問題?你能報告堆棧跟蹤嗎? – Fabio