Using Java 6 Processors in Eclipse
来源:互联网 发布:如何查看计算机mac地址 编辑:程序博客网 时间:2024/06/10 22:27
JDK5 introduced the APT (Annotation Processing Tool). It was part of the SDK but the classes were part of the unofficial com.sun.* namespace, and you had to use the apt tool to process the source code.
JDK6 cleaned up the API and integrated this stuff it into javac itself so you didn’t need to use the separate apt tool anymore.
Apparently built for processing source code with annotations before they are compiled into classes, it can also be used for all kinds of fun like code generation and code analyzers which are IDE independent; and you don’t even need to use annotations necessarily. The JPA2 criteria api meta-model is generated using this.
I made one very contrived example of java6 processor usage with Eclipse. All of this is possible to integrate into a maven build but I’m leaving that out and focusing on how I got this processing to work within Eclipse.
So we’re creating a processor which will generate a new class for each class in projects compiled using this processor. Additionally we’ll create a Warning for each class which starts with a T. Yes it’s silly.
Step 1: Create the processor projectSillyProcessor.java:
01.
@SupportedAnnotationTypes
(value= {
"*"
})
02.
@SupportedSourceVersion
(SourceVersion.RELEASE_6)
03.
public
class
SillyProcessor
extends
AbstractProcessor {
04.
05.
private
Filer filer;
06.
private
Messager messager;
07.
08.
@Override
09.
public
void
init(ProcessingEnvironment env) {
10.
filer = env.getFiler();
11.
messager = env.getMessager();
12.
}
13.
14.
@Override
15.
public
boolean
process(Set elements, RoundEnvironment env) {
16.
17.
for
(Element element : env.getRootElements()) {
18.
19.
if
(element.getSimpleName().toString().startsWith(
"Silly"
)) {
20.
// We don't want generate new silly classes
21.
// for auto-generated silly classes
22.
continue
;
23.
}
24.
25.
if
(element.getSimpleName().toString().startsWith(
"T"
)) {
26.
messager.printMessage(Kind.WARNING,
27.
"This class name starts with a T!"
,
28.
element);
29.
}
30.
31.
String sillyClassName =
"Silly"
+ element.getSimpleName();
32.
String sillyClassContent =
33.
"package silly;\n"
34.
+
"public class "
+ sillyClassName +
" {\n"
35.
+
" public String foobar;\n"
36.
+
"}"
;
37.
38.
JavaFileObject file =
null
;
39.
40.
try
{
41.
file = filer.createSourceFile(
42.
"silly/"
+ sillyClassName,
43.
element);
44.
file.openWriter()
45.
.append(sillyClassContent)
46.
.close();
47.
}
catch
(IOException e) {
48.
e.printStackTrace();
49.
}
50.
51.
}
52.
53.
return
true
;
54.
}
55.
}
Without creating this META-INF entry I couldn’t get the processor to register in Eclipse.
META-INF/services/javax.annotation.processing.Processor:
1.
com.kerebus.annotation.processor.SillyProcessor
Its only contents is the name of the Processor implementation. I guess you might be able to list several processors here, although I’m not sure.
That’s it. Now export it as a jar and use that jar in other projects where you wish to use the processor.
STEP 2: Create a project which uses your processor.In the properties for your new project go to Java Compiler -> Annotation Processing
Check the “Enable Project Specific Settings” and make sure “Enable annotation processing” is checked. I also changed the generated source directory to a name which didn’t start with a dot so it wouldn’t be hidden in the package explorer (files or directories which start with a dot are by default filtered away in eclipse).
Next off go to Java Compiler -> Annotation Processing -> Factory Path
Here you should add the jar of your processor project. You cannot use project references.
Press the “Advanced” button and you’ll be presented with a dialog which contains the processor you defined in your META-INF/services/javax.annotation.processing.Processor file. Select it and press ok.
We’re practically done. Here’s what it looks like for me in my project:
So we get a warning for the Thing class because its class name start with a “T” and for each class in the project we get corresponding “Silly” classes generated. These are compiled and usable just like any other normal class.
For more info check out the eclipse jdt/apt docs, this bit about creating a code analyzer or the offical docs
- Using Java 6 Processors in Eclipse
- Using Subversion in Eclipse
- Using Eclipse Metrics plug-in
- Scala in Eclipse using Maven
- Using mockito in java
- Using REST in Java
- Using scrolls in java
- Java Preprocessor Using Eclipse
- Using Sockets in Java - Client
- Using Sockets in Java - Server
- using mysql in java application
- Utilizing multi-core processors in NS-2
- using cppunit in eclipse ide on windows
- using swi-prolog jpl in eclipse vista64
- Using Android monkeyrunner from Eclipse in Windows
- how to using jira in eclipse
- Using OpenCV Java with Eclipse
- Using OpenCV Java with Eclipse
- java jtds 连接数据库
- akka actor中FSM有限状态机的设计原则
- SQL Server中Row_number() 和 Rank() 的用法
- 职场的你需要谨慎
- c#关键词implicit和explicit
- Using Java 6 Processors in Eclipse
- java OOP中常用的设计原则
- Python查缺补漏之一 动态实例属性、引用、转义
- cmos 导通的电压关系
- JAVA的时间处理类——Date类与Calendar类
- 查看apache当前并发访问数和进程数
- language="javascript"与 type="text/javascript"
- Jquery插件 easyUI属性汇总
- linux c标准I/O函数