美文网首页
九 基础加强——第三节 注解

九 基础加强——第三节 注解

作者: 杜艳_66c4 | 来源:发表于2022-08-30 11:50 被阅读0次

    1、概念

    2、 JDK内置注解

    内置的注解
    Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。

    作用在代码的注解是

    @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
    @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
    @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
    一般传递参数all @SuppressWarnings("all")

    3、自定义注解 格式&本质

    • 格式:
      元注解
      public @interface 注解名称{}

    • 本质: 注解本质上是一个接口,该接口继承自Annotation
      public interface MyAnno extends java.lang.annotation.Annotation{}

    • 属性:接口中可以定义的成员方法
      接口里的抽象方法就是其属性

    4、自定义注解,属性定义

    属性:接口中的抽象方法

    • 要求:
      1、 属性的返回值类型有下列类型,其他的都不行
      基本数据类型
      String 类型
      枚举
      注解
      以上类型的数组

    2、 定义了属性,在使用时需要给属性赋值
    2.1 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值
    2.2 如果只有一个属性需要赋值,且属性名称是value,则value可省略,直接定义值即可
    2.3 数组赋值时,用{}包裹,如果数组中值是一个,{}可以省略不写
    定义注解


    定义一个注解

    赋值


    注解赋值

    5、自定义注解,元注解

    元注解

    6、在程序中解析注释:获取注解中定义的属性值

    使用步骤:
    1、获取注解定义的位置的对象:Class Method Field
    2、获取指定的注解
    3、调用注解中的抽象方法获取配置的属性值

    注解

    package con.day13.AnnotationDemo;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /*
    描述需要执行的类名和方法名
     */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Pro {
        String className();
        String methodName();
    
    
    }
    /*   ReflectTest 中相当于执行了这
    public class Proimpl implements Pro{
    
        @Override
        public String className() {
            return "con.day13.AnnotationDemo.demo01";
        }
    
        @Override
        public String methodName() {
            return "show";
        }
    }
    
     */
    

    package con.day13.AnnotationDemo;
    
    public class demo01 {
        public void show(){
            System.out.println("demo01 ... show");
        }
    }
    

    主方法

    package con.day13.AnnotationDemo;
    
    import java.lang.reflect.Method;
    
    @Pro(className = "con.day13.AnnotationDemo.demo01",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{
                @Override
                public String className() {
                    return "con.day13.AnnotationDemo.demo01";
                }
                @Override
                public String methodName() {
                    return "show";
                }
            }
             */
    
            Pro an = reflectTestClass.getAnnotation(Pro.class);
            //3、调用注解对象中定义的抽象方法,获取返回值
            String className = an.className();
            String methodName = an.methodName();
    
            System.out.println(className+ "  " + methodName); //con.day13.AnnotationDemo.demo01  show
    
            //4、加载该类进内存
            Class<?> aClass = Class.forName(className);
            //5、创建对象
            Object obj = aClass.newInstance();
            //获取对象方法
            Method method = aClass.getMethod(methodName);
            //执行方法
            method.invoke(obj);
    
        }
    }
    
    结果:
    con.day13.AnnotationDemo.demo01  show
    demo01 ... show
    

    小结:
    1、 以后大多数时候,我们会使用注解,而不是自定义注解
    2、注解给谁用: 1. 编译器, 2、给解析程序用
    3、注解不是程序的一部分,可以理解为注解就是一个标签

    相关文章

      网友评论

          本文标题:九 基础加强——第三节 注解

          本文链接:https://www.haomeiwen.com/subject/cjmkprtx.html