day14-Junit、反射、注解、动态代理

Junit

  • 作用

    • 用于测试代码,以方法作为单元的方式测试
  • 好处

    • 1.可以实现自动化测试
    • 2.可以生成测试报告
    • 3.断言
  • 常用注解

    • 4.x

      • @Test
        • 用于测试方法
      • @Before
        • 在每个方法执行前执行
      • @After
        • 在每个方法执行完执行
      • @BeforeClass
        • 在所有方法执行前执行一次
      • @AfterClass
        • 在所有的方法执行完执行一次
    • 5.x

      • @Test

        • 用于测试方法
      • @BeforeEach

        • 在每个方法执行前执行
      • @AfterEach

        • 在每个方法执行完执行
      • @BeforeAll

        • 在所有方法执行前执行一次
      • @AfterAll

        • 在所有的方法执行完执行一次
      • Assertions

        • 断言的类

          package com.itheima.demo02_junit;
          
          
          import org.junit.jupiter.api.*;
          
          public class Test3 {
             static   Utils u;
           //   @BeforeClass
              @BeforeAll
              public static void beforeClass() {
                  System.out.println("执行了beforeClass的方法...");
                  u = new Utils();
          
              }
          
             // @Before
              @BeforeEach
              public void before() {
                  System.out.println("执行了before的方法...");
              }
          
              @Test
              public void test1() {
                  int max = u.getMax(10, 20);
                  System.out.println(max);
          
              }
          
              @Test
              public void testGetMin() {
                  int[] arr = {66, 33, 55, 88, 44, 22};
                  int min = u.getMin(arr);
                  System.out.println(min);
              }
          
              // @AfterClass
              @AfterAll
              public static void afterClass() {
                  System.out.println("执行了AfterClass的方法...");
                  u = null;
              }
          
             //  @After
              @AfterEach
              public void after() {
                  System.out.println("执行了After的方法...");
              }
          
              // 主要对资源进行初始化和销毁
          }
          
          

反射

  • 作用

    • 获取类的所有的成员,再去使用
  • 好处

    • 可以无视修饰符
  • 使用场景

    • IDEA、框架
  • 使用步骤

    • \1. 先获取这个类的class对象

      • 类名.class
      • 对象名.getClass();
      • Class.forName(类全名);
    • \2. 要用什么成员,就先获取对应的成员

      • class对象.getDeclaredXxx(xxx)
        • 构造器
          • constructor
        • 属性/字段
          • field
        • 方法
          • Method
        • 注解
          • Annotation
    • \3. 全部都设置暴力反射【设置访问权】【即使是private也可以访问】

      • 成员.setAccessible(true);
    • \4. 使用成员

      • 构造器

        • 构造器成员.newInstance(xxx , xx)
      • 字段

        • 字段成员.set(对象,值)
        • 返回值 字段成员.get(对象)
      • 方法

        • invoke(对象 ,参数…)

          package com.itheima.demo07_综合案例;
          
          public class Student {
              private String name;
              private int age;
              private double money;
              private String address;
          
          
              public Student() {
              }
          
              public Student(String name, int age, double money, String address) {
                  this.name = name;
                  this.age = age;
                  this.money = money;
                  this.address = address;
              }
          
              /**
               * 获取
               * @return name
               */
              public String getName() {
                  return name;
              }
          
              /**
               * 设置
               * @param name
               */
              public void setName(String name) {
                  this.name = name;
              }
          
              /**
               * 获取
               * @return age
               */
              public int getAge() {
                  return age;
              }
          
              /**
               * 设置
               * @param age
               */
              public void setAge(int age) {
                  this.age = age;
              }
          
              /**
               * 获取
               * @return money
               */
              public double getMoney() {
                  return money;
              }
          
              /**
               * 设置
               * @param money
               */
              public void setMoney(double money) {
                  this.money = money;
              }
          
              /**
               * 获取
               * @return address
               */
              public String getAddress() {
                  return address;
              }
          
              /**
               * 设置
               * @param address
               */
              public void setAddress(String address) {
                  this.address = address;
              }
          
              public String toString() {
                  return "Student{name = " + name + ", age = " + age + ", money = " + money + ", address = " + address + "}";
              }
          }
          
          
          
          package com.itheima.demo07_综合案例;
          
          public class Teacher {
              private String id;
              private String name;
              private String gender;
              private double salary;
          
              public Teacher() {
              }
          
              public Teacher(String id, String name, String gender, double salary) {
                  this.id = id;
                  this.name = name;
                  this.gender = gender;
                  this.salary = salary;
              }
          
              /**
               * 获取
               * @return id
               */
              public String getId() {
                  return id;
              }
          
              /**
               * 设置
               * @param id
               */
              public void setId(String id) {
                  this.id = id;
              }
          
              /**
               * 获取
               * @return name
               */
              public String getName() {
                  return name;
              }
          
              /**
               * 设置
               * @param name
               */
              public void setName(String name) {
                  this.name = name;
              }
          
              /**
               * 获取
               * @return gender
               */
              public String getGender() {
                  return gender;
              }
          
              /**
               * 设置
               * @param gender
               */
              public void setGender(String gender) {
                  this.gender = gender;
              }
          
              /**
               * 获取
               * @return salary
               */
              public double getSalary() {
                  return salary;
              }
          
              /**
               * 设置
               * @param salary
               */
              public void setSalary(double salary) {
                  this.salary = salary;
              }
          
              public String toString() {
                  return "Teacher{id = " + id + ", name = " + name + ", gender = " + gender + ", salary = " + salary + "}";
              }
          }
          
          ///
          package com.itheima.demo07_综合案例;
          
          public class Dog {
              private String name;
              private String type;
              private String color;
          
              public Dog() {
              }
          
              public Dog(String name, String type, String color) {
                  this.name = name;
                  this.type = type;
                  this.color = color;
              }
          
              /**
               * 获取
               * @return name
               */
              public String getName() {
                  return name;
              }
          
              /**
               * 设置
               * @param name
               */
              public void setName(String name) {
                  this.name = name;
              }
          
              /**
               * 获取
               * @return type
               */
              public String getType() {
                  return type;
              }
          
              /**
               * 设置
               * @param type
               */
              public void setType(String type) {
                  this.type = type;
              }
          
              /**
               * 获取
               * @return color
               */
              public String getColor() {
                  return color;
              }
          
              /**
               * 设置
               * @param color
               */
              public void setColor(String color) {
                  this.color = color;
              }
          
              public String toString() {
                  return "Dog{name = " + name + ", type = " + type + ", color = " + color + "}";
              }
          }
          
          
          ///
          package com.itheima.demo07_综合案例;
          
          import java.io.PrintWriter;
          import java.lang.reflect.Field;
          import java.util.ArrayList;
          import java.util.Collections;
          
          public class Test {
              public static void main(String[] args) throws Exception {
                  Student s1 = new Student("张三", 23, 6668, "广州");
                  Teacher t1 = new Teacher("0001", "Mylo", "男", 234567);
                  Dog d1 = new Dog("小哈", "哈士奇", "黑白");
                  ArrayList list = new ArrayList();
                  Collections.addAll(list, s1, t1, d1);
                  // 0.创建流
                  PrintWriter pw = new PrintWriter("day14_junit-reflection-proxy-anno\\file\\objectInfo.txt");
                  for (Object o : list) {
                      // 1.先获取当前对象的class对象
                      Class clazz = o.getClass();
                      String[] className = clazz.getName().split("\\.");
                      pw.println("================" + className[className.length - 1] + "======================");
                      // 2.获取所有的字段
                      Field[] fields = clazz.getDeclaredFields();
                      // 3. 遍历所有的字段,获取对应字段的值出来
                      for (Field field : fields) {
                          field.setAccessible(true);
                          Object value = field.get(o);
                          pw.println(field.getName() + "=" + value);
                      }
                  }
                  pw.close();
              }
          }
          
          

注解【了解】

  • 作用
    • 做标记
      • @Test
      • @Override
    • 参数传递
      • @Book(name = “xxx” , price = 100)
  • 定义
    • public @interface 注解名{ 8种基本数据类型 String 枚举 注解 Class 上面所有的类型的一维数组 }
  • 元注解
    • 作用
      • 用来约束注解的注解
    • 分类
      • @Target
        • 用来限定注解的使用范围
      • @Retention
        • 用来限定注解的生命周期
          • source
            • 在java文件中有
          • class
            • java文件有,class文件中也有
          • runtime
            • java文件有,class文件中也有 , 运行时也有
  • 注解解析的步骤
    • \1. 先获取class对象
    • \2. 获取注解所在的成分【方法、字段 、 类…】
    • 3.判断当前成分上是否有指定注解
      • isAnnotationPresent(注解类型)
    • \4. 获取这个注解
      • getDeclaredAnnotation(注解类型)

动态代理

  • 作用
    • 在不改变类的前提下,增强这个类的功能
  • 使用步骤
    • \1. 先创建一个接口,让代理对象和 被代理对象 都有同样的方法
    • \2. 创建被代理对象,创建一个子类,实现接口
    • \3. 创建一个代理对象
      • Proxy.newProxyInstance( 当前类.class.getClassLoader() , 被代理对象.getClass().getIntefaces() , new 匿名内部类 );
    • \4. 在代理对象中,实现功能增强
      • 在匿名内部类的invoke方法中写就OK
        • Proxy
          • 实际上就是代理对象
        • method
          • 代理对象执行的方法
        • args
          • 代理对象执行方法时的参数
package com.itheima.demo11_动态代理;

public interface Show { // 唱歌 和 跳舞的接口
    public void sing();  // 唱歌的方法

    public void dance(); // 跳舞的方法

    public int getMax(int a, int b);
}


package com.itheima.demo11_动态代理;

public class Singer implements Show {
    @Override
    public void sing() {
        System.out.println("坤在唱歌: 只因你太美~~");
    }

    @Override
    public void dance() {
        System.out.println("坤穿着背带裤在跳舞~~");
    }

    @Override
    public int getMax(int a, int b) {
        return a > b ? a : b;
    }
}

/
package com.itheima.demo11_动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        // 被代理对象
        Singer s = new Singer();
        // 代理对象的创建
        Show o = (Show)Proxy.newProxyInstance(Test.class.getClassLoader()
                , s.getClass().getInterfaces()
                , new InvocationHandler() {  // 回调函数
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println(method.getName() + ": args:" + Arrays.toString(args));
                        /*
                            proxy ==> 代理对象 --> 就是o  不能用
                            method : 就是代理对象当前执行的方法
                            args : 执行方法的参数
                         */
                        System.out.println("在开始表演之前,收了money~~100W" );
                        Object result = method.invoke(s, args);// 真实对象去执行方法了~
                        System.out.println(method.getName() + ": result:" + result);
                        System.out.println("在开始表演之后,收了money~~50W" );
                        return result;
                    }
                });
        o.sing();
        o.dance();
        int result = o.getMax(10, 20);
        System.out.println(result);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值