打个比方,在类或方法上上有这么个东西@Override
概念:说明程序的,给计算机看的
注意:
1)JDK1.5之后的新特性
2)说明程序的作用
3)使用注解:@注解名称
4)要和注释相区分,注释是给程序员看的
①编写文档
②代码分析
③编译检查
作用:检测被该注解标注的方法是不是继承自父类(接口)的
作用:告诉计算机,这段代码已经过时
作用:压制警告,消除所有警告
注意:一般传递参数“all”
比如: @SuppressWarnings(“all”)
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
元注解
public @interface Override {
}
public interface MyAnno extends java.lang.annotation.Annotation {
}
注解本质就是一个接口,该接口默认继承Annotation接口
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Pro { String className(); String methodName(); }
说的直白一点,其实是里面的方法,属于叫做属性。
1.属性的返回值类型只允许是如下的几类
①基本数据类型
②String
③枚举
④注解
⑤以上类型的数组
2.定义的属性,使用时需要给属性赋值,如下代码:
@Pro(className = "cn.itcast.annotation.Demo1",methodName = "show") public class ReflectTest {
几种特殊状况:
①如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性赋值。
②如果只有一个属性要赋值,并且属性的名称是value,则value可以省略,直接定义即可
③数组赋值时,要用大括号赋值(只有一个值得话,大括号可以省略)
概念:用于描述注解的注解
作用:描述注解作用的位置
参数:ElemenType取值
TYPE:可以作用在类上
METHOD:可以作用在方法上
FIELD:可以作用在成员变量上
作用:描述注解被保留的阶段
举例
*@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
作用:描述注解是否被抽取到api文档中
作用:描述注解是否可以被子类继承
功能一:获取注解中定义的属性值
下面展示一些 直接上代码:
。
@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); //返回一个cls对象 //4.创建对象 Object obj = cls.newInstance(); //5.获取方法对象 Method method = cls.getMethod(methodName); //6.执行方法 method.invoke(obj); } }
步骤:
1.获取注解定义位置的对象(Class)
2.获取指定的注解
public class ProImpl implements Pro { public String className() { return "cn.itcast.annotation.Demo1"; } public String methodName() { return "show"; } //其实就是在内存中生成了一个该注解接口的子类实现对象
3.调用注解中的抽象方法获取配置的属性