暑期自学 Day 08 | Junit,反射,注解(二)

Class 对象功能获取成员变量实例
        Class p = Person.class;

        // Field[] getFields()
        // 获取 public 修饰的成员变量
        Field[] fs = p.getFields();
        for (Field f : fs) {
            System.out.println(f);
        }
        // Field getField(String name);
        Field f1 = p.getField("a");
        Person pe = new Person();

        f1.set(pe,"哈哈");
        System.out.println(pe);

        // Filed[] getDeclaredFields()
        // 获取所有成员变量
        Field[] fs2 = p.getDeclaredFields();
        for (Field f : fs2) {
            System.out.println(f);
        }

        // Field getDeclaredField(String name)
        // 获取指定成员变量
        Field f2 = p.getDeclaredField("name");
        Person pe2 = new Person();
        // 暴力反射,忽略安全检查
        f2.setAccessible(true);
        f2.set(pe2,"名字");
        System.out.println(pe2);
Class 对象功能获取构造方法变量实例
  • 构造器是用来创建对象的

          Class personClass = Person.class;
    
          // 构造器 (带参) 创建对象
          Constructor constructor = personClass.getConstructor(String.class, int.class);
          System.out.println(constructor);
    
          Object person = constructor.newInstance("张三",18);
          System.out.println(person);
    
          // 构造器 (空参)创建对象
          Object o = personClass.newInstance();
          System.out.println(o);
    
          // 获取构造器 (public)
          Constructor[] c1 = personClass.getConstructors();
          for (Constructor c : c1) {
              System.out.println(c);
          }
    
          // 获取构造器 (带参)
          Class[] parameterType = new Class[]{String.class, int.class};
          Constructor c = personClass.getConstructor(parameterType);
          System.out.println("Constructor of myClass: " + c);
  • 获取 constructor 的相关方法和获取成员变量的相关方法类似,但获取带参构造方法时记得传递所需参数数组。

Class 对象获取 Method 实例
        Class personClass = Person.class;

        Method eatMethod1 = personClass.getMethod("eat");
        Method eatMethod2 = personClass.getMethod("eat",String.class);

        Person p = new Person();

        // 执行方法
        eatMethod1.invoke(p);
        eatMethod2.invoke(p,"饭");
  • 通过反射,一旦所使用的对象和方法发生更改,我们只需要修改配置文件即可,无需对代码进行更改。在大型项目中能够提高效率。

注解 Annotation

  • 内置注解

    • Override: 检测被该注解标注的方法是否继承父类或接口
    • Deprecated:该注解标注的内容已过时
    • SuppressWarnings:压制警告,需要传参
  • 自定义注解

    • 格式
      • 元注解
      • public @interface 注解名称{ 属性列表(成员方法); }
    • 注解本质上是一个接口,默认继承 Annotation 接口
    • 属性:接口中可以定义的成员方法(抽象方法)
      • 返回值类型:
        • 基本数据类型
        • 字符串
        • 枚举
        • 注解
        • 以上类型的数组
    • 定义属性后,使用时需要给属性赋相应的值
    • 元注解:用于描述注解的注解
      • @Target() 描述注解能够作用的位置
        • @Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FEILD}) // 作用于 成员变量,方法,类
      • @Retention() 注解能被保留的阶段
        • @Retention(RetentionPolicy.RUNTIME) 或 SOURCE, CLASS
      • @Documented 描述注解是否被抽取到 API 文档
      • @Inherited 描述注解是否被继承
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

注解那一块希望来一点代码例子

##哈哈哈

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!