Jur*_*nju 8 java eclipse annotation-processing
我已经编写了一个Java注释处理器,通过扩展javax.annotation.processing.AbstractProcessor
在Eclipse上下文中调用它并且工作正常,除了我需要有关处理器工作的源路径和类路径的更多信息:
@SupportedAnnotationTypes({"MyAnno"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class Processor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// this used to work in Java4 but not anymore (since Java6?):
String sourcePath = processingEnv.getOptions().get("sourcepath");
String classPath = processingEnv.getOptions().get("classpath");
for (Element e : roundEnv.getElementsAnnotatedWith(MyAnno.class)) {
myProcess(e, sourcePath, classPath);
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是如何在注释处理上下文(实现process
)中检索一个有效的JavaFileManager
,它可以给出源路径和当前正在执行注释处理器的编译器的类路径.最好,我会找到一个不涉及对Eclipse/JDT特定接口的依赖的解决方案.
我已经试过这不以下不工作:
DiagnosticCollector<JavaFileObject> diagnostics =
new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(diagnostics, null, null);
fm.getLocation(StandardLocation.CLASS_PATH); // prints an empty class path
Run Code Online (Sandbox Code Playgroud)
对于 Java 8 及之前版本:
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.util.Context;
import javax.annotation.processing.ProcessingEnvironment;
protected static JavaFileManager getJavaFileManager(ProcessingEnvironment env) {
JavaFileManager fm = null;
if (env instanceof JavacProcessingEnvironment) {
Context context = ((JavacProcessingEnvironment) env).getContext();
fm = context.get(JavaFileManager.class);
}
return fm;
}
Run Code Online (Sandbox Code Playgroud)
对于 Java 9 和 10 以及更高版本(和 8),请使用反射来避免出现此 错误:
protected static JavaFileManager getJavaFileManager(ProcessingEnvironment env) {
JavaFileManager fm = null;
try {
/*
* Context context = ((JavacProcessingEnvironment) env).getContext();
*/
Method getContext = env.getClass().getMethod("getContext");
Object context = getContext.invoke(env);
/*
* fm = context.get(JavaFileManager.class);
*/
Method get = context.getClass().getMethod("get", Class.class);
fm = (JavaFileManager) get.invoke(context, JavaFileManager.class);
} catch (Exception exception) {
}
return fm;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
862 次 |
最近记录: |