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