注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、 接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素 进行说明,注释。
自定义注解作用: 可以指定含有注解的方法执行,可以指定参数。
作用:指明此注解用在哪个位置,如果不写默认是任何地方都可以使用。 可选的参数值在枚举类ElemenetType中包括:
作用:定义该注解的生命周期(有效范围)。 可选的参数值在枚举类型RetentionPolicy中包括
可以让用户在使用注解时传递参数,让注解的功能更加强大。
格式1:数据类型 属性名(); 格式2:数据类型 属性名() default 默认值;
元注解
public @interface 注解名称{
属性列表;
}
public @interface Student {
// 姓名
String name();
// 年龄
int age() default 18;
// 性别
String gender() default "男";
}// 该注解就有了三个属性:name,age,gender
八种基本数据类型(int,flfloat,boolean,byte,double,char,long,short)
String类型,Class类型,枚举类型,注解类型
以上所有类型的一维数组
注解MyAnnotation
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.METHOD)
public @interface MyAnnotation {
// 多位作者
String[] authors();
// 书名
String value()default "暮光之城";
// 价格
double price() default 100;
}
具体使用类TestAnnotation
public class TestAnnotation {
//有注解的被调用执行,并获取注解中的值
@MyAnnotation(authors = "张三")
public void test01() {
System.out.println("Test MyAnnotation");
}
//没有注解的不执行
public void test02() {
System.out.println("I am Test02");
}
}
测试类Test
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
//执行方法
TestAnnotation obj = new TestAnnotation();
run(obj);
}
//执行含有注解的方法
public static void run(Object obj) throws Exception {
//利用反射获取成员方法
Method[] methods = obj.getClass().getMethods();
for (Method m : methods) {
//从方法中获取含有指定注解
MyAnnotation my = m.getDeclaredAnnotation(MyAnnotation.class);
if (my != null) {
//获取注解的参数
System.out.println("书名为:" + my.value());
System.out.println("作者为:" + (my.authors())[0]);
System.out.println("价格为:" + my.price());
//执行含有注解的方法
m.invoke(obj);
}
}
}
}