?? hibernateannotationprocessor.java
字號(hào):
import com.sun.mirror.apt.*;
import com.sun.mirror.declaration.*;
import com.sun.mirror.type.*;
import com.sun.mirror.util.*;
import java.beans.*;
import java.io.*;
import java.util.*;
import java.lang.reflect.*;
/**
* Description:
* <br/>Copyright (C), 2005-2008, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class HibernateAnnotationProcessor implements AnnotationProcessor
{
//Annotation處理器環(huán)境,是該處理器與APT交互的重要途徑
private AnnotationProcessorEnvironment env;
//構(gòu)造HibernateAnnotationProcessor對(duì)象時(shí),獲得處理器環(huán)境
public HibernateAnnotationProcessor(AnnotationProcessorEnvironment env)
{
this.env = env;
}
//循環(huán)處理每個(gè)對(duì)象
public void process()
{
//遍歷每個(gè)class文件
for (TypeDeclaration t : env.getSpecifiedTypeDeclarations())
{
//定義一個(gè)文件輸出流,用于生成額外的文件
FileOutputStream fos = null;
//獲取正在處理的類名
String clazzName = t.getSimpleName();
//獲取類定義前的Persistent Annotation
Persistent per = t.getAnnotation(Persistent.class);
//當(dāng)per Annotation不為空時(shí)才繼續(xù)處理
if(per != null)
{
try
{
//創(chuàng)建文件輸出流
fos = new FileOutputStream(clazzName + ".hbm.xml");
PrintStream ps = new PrintStream(fos);
//執(zhí)行輸出
ps.println("<?xml version=\"1.0\"?>");
ps.println("<!DOCTYPE hibernate-mapping");
ps.println(" PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"");
ps.println(" \"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\">");
ps.println("<hibernate-mapping>");
ps.print(" <class name=\"" + t);
//輸出per的table()的值
ps.println("\" table=\"" + per.table() + "\">");
for (FieldDeclaration f : t.getFields())
{
//獲取指定FieldDeclaration前面的IdProperty Annotation
IdProperty id = f.getAnnotation(IdProperty.class);
//如果id Annotation不為空
if (id != null)
{
//執(zhí)行輸出
ps.println(" <id name=\""
+ f.getSimpleName()
+ "\" column=\"" + id.column()
+ "\" type=\"" + id.type()
+ "\">");
ps.println(" <generator class=\""
+ id.generator() + "\"/>");
ps.println(" </id>");
}
//獲取指定FieldDeclaration前面的Property Annotation
Property p = f.getAnnotation(Property.class);
//如果p Annotation不為空
if (p != null)
{
//執(zhí)行輸出
ps.println(" <property name=\""
+ f.getSimpleName()
+ "\" column=\"" + p.column()
+ "\" type=\"" + p.type()
+ "\"/>");
}
}
ps.println(" </class>");
ps.println("</hibernate-mapping>");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
//關(guān)閉輸出流
try
{
if (fos != null)
{
fos.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -