注解处理器分为:在运行时(Runtime)通过反射机制运行处理的注解,和在编译时(Compile time)处理的注解。
例子一:
用注解生成table,就像Java里用注解定义Bean一样。
实现生成如下表格代码
<table border="1">
<tr align="center">
<td width="100">111</td>
<td width="50">333</td>
</tr>
<tr>
<td>222</td>
<td>444</td>
</tr>
</table>
Table.java
package myTest3;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
int border() default 0; //是否加粗
}
Tr.java
package myTest3;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Tr {
String align() default ""; //对齐方式
}
Td.java
package myTest3;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Td {
int width() default 100; //宽度
int id() default 0; //序号
}
Student.java
package myTest3;
@Table(border = 1)
public class Student {
@Tr(align = "center")
@Td(id = 1, width = 100)
private String name; //姓名
@Td(id = 2, width = 50)
private String id; //学号
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
TestMain.java
package myTest3;
public class TestMain {
public static void main(String args[]) {
Student student = new Student();
student.setId("99");
student.setName("张三");
AnnotationUtil.getAnnInfo(student);
}
}
注解处理类AnnotationUtil.java
package myTest3;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 注解处理类
*
*/
public class AnnotationUtil {
public static void getAnnInfo(Object obj) {
Class<?> clazz = obj.getClass();
StringBuilder sb = new StringBuilder();
if (clazz.isAnnotationPresent(Table.class)) {
System.out.println("存在table注解");
Table table = clazz.getAnnotation(Table.class);
sb.append("<table border=").append("\"").append(table.border()).append("\">");
Field[] fields = clazz.getDeclaredFields();
//遍历field
for(Field field :fields) {
Method method = null;
if(field.isAnnotationPresent(Tr.class)) {
System.out.println("存在tr注解");
Tr tr = (Tr) field.getAnnotation(Tr.class);
sb.append("<tr align=").append("\"").append(tr.align()).append("\">");
}
if (field.isAnnotationPresent(Td.class)) {
System.out.println("存在td注解");
Td td = (Td) field.getAnnotation(Td.class);
sb.append("<td id=").append("\"").append(td.id()).append("\"").append(" width=").append("\"").append(td.width()).append("\">");
//执行这个私有字段的get方法获取值
String fieldName = field.getName();
String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
try
{
method = clazz.getMethod("get" + methodName);
}
catch (SecurityException e)
{
//e.printStackTrace();
}
catch (NoSuchMethodException e)
{
// e.printStackTrace();
}
}
try {
sb.append(method.invoke(obj));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sb.append("</td>");
}
sb.append("</tr>");
sb.append("</table>");
System.out.println("字符串:" + sb);
}
}
}
执行结果:
存在table注解
存在tr注解
存在td注解
存在td注解
字符串:<table border="1"><tr align="center"><td id="1" width="100">张三</td><td id="2" width="50">99</td></tr></table>