Java注解
2016-02-10 20:06
204 查看
1. Annotation简介
JDK1.5开始,Java增加了对元数据(即类的组成单元数据)的支持,也就是注释(Annotation)。他是代码里做的特殊标记,这些标记可以在编译、类加载,运行时在不改变原有逻辑的情况下,被读取,并执行相应的处理,通过使用Annotation,程序员可以在源文件中嵌入一些补充的信息。Annotation类似于修饰符一样被使用,可以用于包、类、构造方法、方法、成员变量、参数、局部变量的声明。系统提供了一些Annotation,比较常用的有:@Override、@Deprecated、@SuppressWarnings。@Override
表示当前的方法定义将覆盖超类中的方法。
@Deprecated
表示的是一个类或方法已经不再建议继续使用了,标记为已过时。
@SuppressWarnings
表示关闭不当的编译器警告信息。
@Documented
此注解表示的是文档化,可以在生成doc文档时添加注解
@Target
表示的是一个Annotation的使用范围,@Target的作用范围由ElementType决定,可以取值为TYPE(使用范围为类、接口或枚举)、FIELD(使用范围为成员变量)、METHOD(使用范围为方法)、PARAMETER(使用范围为参数上)、CONSTRUCTOR(使用范围为构造函数)、LOCAL_VARIABLE(使用范围为局部变量)、ANNOTATION_TYPE(使用范围为Annotation中)、PACKAGE(使用范围为包中)。
@Retention
@Retention表示的是Annotation的时间作用范围,而Retention指定的范围由RetentionPolicy决定,RetentionPolicy指定了三种范围: SOURCE、CLASS、RUNTIME。SOURCE代表注解在源程序中存在、CLASS代表注解在class文件中存在、RUNTIME代表注解在运行时存在。
@Inherited
@Inherited表示Annotation是否可以被其子类继承下来。加上@Inherited表示允许被子类继承下来。
2. 自定义注解
那么如何自定义Annotation呢?简单来说就是以下3个步骤:1)编写注解
2)在类上应用注解
3)对应用了注解的类进行反射操作。
自定义Annotation的语法如下:
访问控制权限 @interface Annotation名称{}
例如:public @interface MyAnnotation{}
2.1 在Annotation中定义变量
public @interface MyAnnotation { //定义变量 public String name(); public String info(); }
定义变量后,调用此Annotation时必须设置变量值:
@MyAnnotation(name = "oner.wv", info = "cls") public class Person { }
可以通过default指定变量默认值,指定了以后在使用此Annotation时可以不用在设置变量值:
public @interface MyAnnotation { // 定义变量 public String name() default "oner.wv"; public String info() default "cls"; }
@MyAnnotation public class Person { }
定义一组变量的数组,接收一组参数
public @interface MyAnnotation { // 定义变量的数组,接收一组参数 public String[] grade(); }
@MyAnnotation(grade = { "one", "two", "three" }) public class Person { }
可以使用枚举限制变量的取值范围
public @interface MyAnnotation { public Color[] color(); }
2.2 反射与Annotation
一个Annotation真正起作用,必须结合反射机制。
Color.class
package com.oner.wv; public enum Color { RED,GREEN,BLUE }
MyAnnotation.class
package com.oner.wv; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义注解 * * @author Oner.wv * */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { // 定义变量 public String name() default "oner.wv"; public Color color(); // 定义变量的数组,接收一组参数 public String[] grade(); }
Person.class
package com.oner.wv; @MyAnnotation(grade = { "one", "two", "three" }, color = Color.BLUE) public class Person { private String name; private Color color; public String getName() { return name; } public void setName(String name) { this.name = name; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } @Override public String toString() { return "Person [name=" + name + ", color=" + color + "]"; } @Deprecated public void print() { System.out.println("person:" + name); } }
测试类:
Test.class
package com.oner.wv; import java.lang.annotation.Annotation; public class Test { @SuppressWarnings("deprecation") public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Person p = new Person(); p.print(); Class personClass = Class.forName("com.oner.wv.Person"); // 通过反射得到Annotation Annotation a = personClass.getAnnotation(MyAnnotation.class); // 强制转换为MyAnnotation MyAnnotation ma = (MyAnnotation) a; // 获取自定义注解的变量 String name = ma.name(); Color color = ma.color(); // 通过反射得到Person类的实例 Person p1 = (Person) personClass.newInstance(); p1.setName(name); p1.setColor(color); System.out.println(p1); } }
运行结果:
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序