Java中注解Annotation的定义、使用、解析
此例子,用于说明如何在 Java 中对“注解 Annotation”的定义、使用和解析的操作。注解一般用于自定义开发框架中,至于为什么使用,此处不作过多说明,这里只说明如何使用,以作备记。下面例子已测试,可以正常运行通过。
1、注解自定义。
这里定义两个注解,分别用来注解类和注解属性。
package cc.rulian.ann;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- 类注释
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyTable
{
public String name() default "";
public String version() default "1";
}
package cc.rulian.ann;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- 字段注释
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyField {
public String name() default ""; //名称
public String type() default ""; //类型
}
2、注解的使用。
说明如何在类中使用自定义注解。
package cc.rulian.ann;
import java.util.Date;
/**
- 基础日志
*/
@MyTable(name="T_BaseLog",version="2")
public class BaseLog{
@MyField(name</span>="addTime",type="Date"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span> Date log_time; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 时间</span>
@MyField(name="log_level",type="String")
private String log_level; // 级别
@MyField(name="message",type="String")
private String message; // 日志内容
<span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Date getLog_time()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> log_time;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setLog_time(Date log_time)
{
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.log_time =<span style="color: rgba(0, 0, 0, 1)"> log_time;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getLog_level()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> log_level;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setLog_level(String log_level)
{
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.log_level =<span style="color: rgba(0, 0, 0, 1)"> log_level;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getMessage()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> message;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setMessage(String message)
{
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.message =<span style="color: rgba(0, 0, 0, 1)"> message;
}
}
3、注解的解析。
说明如何解析注解。
package cc.rulian.ann;
import java.lang.reflect.Field;
/**
- 读取注释
*/
public class ReadAnn
{
public static void main(String[] args)
{
// 读取类的注释
BaseLog obj = new BaseLog();
// Annotation[] arr = obj.getClass().getAnnotations(); //得到所有注释
MyTable table = obj.getClass().getAnnotation(MyTable.class); // 取得指定注释
System.out.println("类注释(name):" + table.name());
System.out.println("类注释(version):" + table.version());
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 读取属性的注释</span>
Field[] fields =<span style="color: rgba(0, 0, 0, 1)"> obj.getClass().getDeclaredFields();
</span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> (Field f : fields)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Annotation[] arr2 = f.getAnnotations(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">得到所有注释</span>
MyField ff = f.getAnnotation(MyField.<span style="color: rgba(0, 0, 255, 1)">class</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 取得指定注释</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(ff != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
{
System.out.println(</span>"属性(" + f.getName() + "): " + ff.name() + " -- " +<span style="color: rgba(0, 0, 0, 1)"> ff.type());
}
}
}
}
4、解析输出结果。
类注释(name): T_BaseLog
类注释(version): 2
属性(log_time): addTime -- Date
属性(log_level): log_level -- String
属性(message): message -- String