Java基础篇——注解和反射

注解

注解Annotation可以被其他程序(编译器)读取,常见的有@override

内置注解

  • @Override

    适用于修饰方法,表明重写父类中的一个方法

  • @Deprecated

    用于修饰类、方法、属性等,表示由于落后或者存在危险被舍弃,不鼓励使用

  • @SuppressWarnings("")

    用于镇压编译器的警告,可以有很多参数选择“all”"unchecked""value={"unchecked","deprecation"}"

元注解

用于解释其他注解的注解

  • @Target()

    @Target(value=ElementType.METHOD)//表明该注解只能用于方法
    

    带参,用于描述注解的使用范围

  • @Retention

    描述注解的生命周期

    (SOURCE、CLASS、RUNTIME)

  • @Documented

    表示是否将注解生成在JAVAdoc中

  • @Inherited

    表示子类可以继承父类的注解

自定义注解

  • 使用@interface定义

    public @interface 注解名 {
       //参数定义方法:参数类型+参数名();
       int age() default 0;//默认值为0
    }
    //代码块中的方法即是注解的参数
    //可以通过default来声明参数的默认值
    //注解元素必须要有值
    

反射

反射Reflection的出现使Java成为了准动态语言,利用反射机制,可以使原本静态的Java语言获得类似动态语言的特性,取得任何类的内部信息,包括private修饰的属性

  • 获取反射对象

    Class 对象名  = 类的class属性;
    Class 对象名  = Class.forName("类路径");
    Class 对象名  = 类实例对象.getClass();
    
  • 有Class对象的类型

    [所有的类、接口、数组、枚举、注解、基本数据类型、void]

  • 不会引发类初始化的情况

    • 子类引用父类静态变量
    • 通过数组定义引用类
    • 引用类的常量属性
  • 类的加载机制

  • 获取类的运行时结构

            ReflectionTest test = new ReflectionTest();//创建类实例
            //反射获取类对象
            //Class myclass =Class.forName("practice11.ReflectionTest");
            Class myclass =test.getClass();
            //获取类名
            System.out.println(myclass.getName());
            System.out.println(myclass.getSimpleName());
            //获取属性
            Field[] fields1 = myclass.getFields();//获取public属性
            Field[] fields2 = myclass.getDeclaredFields();//获取所有属性
            //获取方法
            Method[] methods1 = myclass.getMethods();//获取该类及其父类的所有public方法
            Method[] methods2 = myclass.getDeclaredMethods();//获取本类的所有方法
    
  • 动态创建对象

        Class myRft = Class.forName("practice11.ReflectionTest");
        //使用反射对象的newInstance方法实例化对象/
      ReflectionTest test1 =(ReflectionTest) myRft.newInstance();//调用无参构造
        System.out.println(test1.toString());
        //使用构造器实例化对象
        Constructor constructor = myRft.getConstructor(String.class, int.class);
        ReflectionTest test2 =(ReflectionTest) constructor.newInstance("祖国万岁",72);//调用有参构造
        //通过反射调用方法
        Method name = myRft.getDeclaredMethod("setName", String.class);//获取方法
        name.invoke(test2,"中国万岁");//调用方法
        //通过反射修改属性
        Field age = myRft.getDeclaredField("age");
        age.setAccessible(true);//关闭权限检测(可以修改私有属性)
        age.set(test2,70);
    
  • 通过反射获得注解

            //获得类层的所有注解
            Annotation[] annotations = Student.class.getAnnotations();
            //获得属性的注解
            Field[] fields = Student.class.getFields();
            for (Field field : fields) {
                MyField fieldAnnotations = field.getAnnotation(MyField.class);
                System.out.println(fieldAnnotations);
            }
    
posted @ 2021-03-25 21:26  姬如乀千泷  阅读(57)  评论(0)    收藏  举报