java 注解
注解概述
java 注解(Annotation)又称 Java 标注,用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。
总结:
1 jdk1.5以后的新特性
2. 说明程序的
3. 使用注解 @注解名称
2注解的格式和本质
格式:
元注解 :
public @interface 注解名称{ }
本质:
注解本质上是一个借口,该接口默认继承Annotation{}
元注解:
用于描述注解的注解。
@Target 描述注解的作用范围
ElementType:
- TYPE 类上面 :Class, interface (including annotation type), or enum declaration
- FIELD 字段声明(包括枚举常量), Field declaration (includes enum constants)
- METHOD 方法 , Method declaration
- PARAMETER 参数 Formal parameter declaration
- CONSTRUCTOR 构造函数 , Constructor declaration
- LOCAL_VARIABLE 局部变量 Local variable declaration
- ANNOTATION_TYPE 注释类型 Annotation type declaration
- PACKAGE 包声明 Package declaration
- TYPE_PARAMETER 类型参数 Type parameter declaration 从jdk1.8开始
- TYPE_USE 类型使用 Use of a type 从jdk1.8开始
@Retention 描述注解被保留的阶段 (java 代码在计算机中的三个阶段 源代码阶段 - 类对象阶段 - 运行阶段)
@Documented 描述是否被抽取到api文档中
@Inherited 描述 是否被子类继承
3自定义注解属性定义
属性的返回值类型:
1.基本数据类型
2. 枚举
3. String
4. 注解
5. 以上类型的数组
例如:
/**
- 自定义注解
*/
public @interface Myann {
int age() default 19;
int show();
String show2();
Person per();
String[] strs();
}
定义了属性,使用时候需要给属性赋值
1.如果定义属性时,使用default 关键字给默认值初始化,则注解时候,不需要进行属性的赋值
2 如果只有一个属性赋值,并且属性的名字是value,则value可以省略,直接定义值
3数组赋值时候,使用{}包裹,如果数组只有一个值,则{}可以省略。
解析注解
程序中使用注解获取注解中的属性值:
1 获取该类的字节码文件对象(反射获取字节码class对象,前面反射已经说过,分为3种方法)
Class<ReflectTest> reflectTestClass = ReflectTest.class;
2 获取注解定义的位置的对象(class,method,Field)
3 获取指定的注解
Pro annotation = reflectTestClass.getAnnotation(Pro.class);
4 调用注解对象中的抽象方法,获取返回值
String className = annotation.className();
String methodname = annotation.methodname();
例如:
/**
-
描述需要执行的类型和方法名
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {String className();
String methodname();
}
public class Demo02 {
public void show(){
System.out.println("Demo2方法");
}
}
@Pro(className = “AnnotationDay02.Demo02”, methodname = “show”)
public class ReflectTest {
public static void main(String[] args) throws Exception {
//解析注解
//1 获取该类的字节码文件对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
// 2 获取上面的注解类型
Pro annotation = reflectTestClass.getAnnotation(Pro.class); //其实就是在内存中生成一个给注解接口的子类实现对象
// 3 调用注解对象中的抽象方法,获取返回值
String className = annotation.className();
String methodname = annotation.methodname();
//加载该类进内存
Class cls = Class.forName(className);
// 创建对象
Object o = cls.newInstance();
//获取方法对象
Method method = cls.getMethod(methodname);
//z执行方法
method.invoke(o);
}