Java基础之《注解处理器》

注解处理器分为:在运行时(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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值