注解

注解

  • 概念:
    • 说明程序的,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);
          • 如果数组中只有一个值,{}可以省略
  • 元注解
    • :用于描述注解的注解
    • @Target 描述注解能够作用的位置
      • TYPE
        • :可以作用于类上,例:@Target(value = {ElementType.TYPE})//表示这个注解只能作用类上
      • METHOD
        • :可以作用于方法上
      • FIElD
        • :可以作用于成员变量上
    • @Retention :描述注解能被保留的阶段
      • RUNTIME
        • @Retention(RetentionPolicy.RUNTIME)//表示当前被描述的注解,会保留到class字节码文件中,并被jvm读取到
      • SOURCE:
        • 字节码文件都不会存在
      • ClASS:
        • 会被保留到字节码文件中,不会被jvm读取
    • @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);
    }
}
原文地址:https://www.cnblogs.com/lsswudi/p/11517341.html