Junit
-
作用
- 用于测试代码,以方法作为单元的方式测试
-
好处
- 1.可以实现自动化测试
- 2.可以生成测试报告
- 3.断言
-
常用注解
-
4.x
- @Test
- 用于测试方法
- @Before
- 在每个方法执行前执行
- @After
- 在每个方法执行完执行
- @BeforeClass
- 在所有方法执行前执行一次
- @AfterClass
- 在所有的方法执行完执行一次
- @Test
-
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
- 构造器
- class对象.getDeclaredXxx(xxx)
-
\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文件中也有 , 运行时也有
- source
- 用来限定注解的生命周期
- @Target
- 作用
- 注解解析的步骤
- \1. 先获取class对象
- \2. 获取注解所在的成分【方法、字段 、 类…】
- 3.判断当前成分上是否有指定注解
- isAnnotationPresent(注解类型)
- \4. 获取这个注解
- getDeclaredAnnotation(注解类型)
动态代理
- 作用
- 在不改变类的前提下,增强这个类的功能
- 使用步骤
- \1. 先创建一个接口,让代理对象和 被代理对象 都有同样的方法
- \2. 创建被代理对象,创建一个子类,实现接口
- \3. 创建一个代理对象
- Proxy.newProxyInstance( 当前类.class.getClassLoader() , 被代理对象.getClass().getIntefaces() , new 匿名内部类 );
- \4. 在代理对象中,实现功能增强
- 在匿名内部类的invoke方法中写就OK
- Proxy
- 实际上就是代理对象
- method
- 代理对象执行的方法
- args
- 代理对象执行方法时的参数
- Proxy
- 在匿名内部类的invoke方法中写就OK
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);
}
}