注解
注解
- 概念:
- 说明程序的,jdk1.5之后
- jdk中预定义的一些注解
- @override :检测该注解标注的方法是否是继承自父类(接口)的
- @Deprecated : 该注解标注的内容,表示已过时
- @SuppressWarnings:压制警告
- @SuppressWarnings("all"),压制所有警告
- 自定义注解
- 格式:
- public @interface 注解名称{ 属性列表 }
- 本质:本质上是一个接口,该接口默认继承Annotation接口
- 通过反编译可以知道:public interface myAnno extends java.lang.annotation.Annotation {}
- 属性:接口中的抽象方法
- 要求:
- 1,属性的返回值类型有一下几种,其余不行
- 基本数据类型
- String
- 枚举:赋值: = 枚举类名.value
- 注解 = @注解名
- 以上类型的数组 = {value1,value2,...}
- ,2,在使用定义的属性时,给属性赋值
- 例如int age();使用时:@ano(age = 1);
- 如果在注解内定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值
- 例如int age()default 1;使用时:@ano();
- 如果只有一个属性需要赋值,并且属性的名称是value则value可以省略,直接使用值
- 例如int value();使用时:@ano(12);
- 如果数组中只有一个值,{}可以省略
- 1,属性的返回值类型有一下几种,其余不行
- 要求:
- 格式:
- 元注解
- :用于描述注解的注解
- @Target 描述注解能够作用的位置
- TYPE
- :可以作用于类上,例:@Target(value = {ElementType.TYPE})//表示这个注解只能作用类上
- METHOD
- :可以作用于方法上
- FIElD
- :可以作用于成员变量上
- TYPE
- @Retention :描述注解能被保留的阶段
- RUNTIME
- @Retention(RetentionPolicy.RUNTIME)//表示当前被描述的注解,会保留到class字节码文件中,并被jvm读取到
- SOURCE:
- 字节码文件都不会存在
- ClASS:
- 会被保留到字节码文件中,不会被jvm读取
- RUNTIME
- @Documented :描述注解是否能被抽取到api文档中
- @Inherited :描述注解是否被子类继承
- 在程序中使用(解析)注解
注解解析
package cn.itcast.annotation; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Properties; /** * 框架类 */ @Pro(className = "cn.itcast.annotation.Demo1",methodName = "show") public class ReflectTest { public static void main(String[] args) throws Exception { /* 前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法 */ //1.解析注解 //1.1获取该类的字节码文件对象 Class<ReflectTest> reflectTestClass = ReflectTest.class; //2.获取上边的注解对象 //其实就是在内存中生成了一个该注解接口的子类实现对象 /* public class ProImpl implements Pro{ public String className(){ return "cn.itcast.annotation.Demo1"; } public String methodName(){ return "show"; } } */ Pro an = reflectTestClass.getAnnotation(Pro.class); //3.调用注解对象中定义的抽象方法,获取返回值 String className = an.className(); String methodName = an.methodName(); System.out.println(className); System.out.println(methodName); //3.加载该类进内存 Class cls = Class.forName(className); //4.创建对象 Object obj = cls.newInstance(); //5.获取方法对象 Method method = cls.getMethod(methodName); //6.执行方法 method.invoke(obj); } }