单元测试、反射、注解、动态代理
单元测试JUnit
单元测试的目的是针对方法进行测试,
JUnit的两个要点:①必须是公开的,无参数,无返回值的方法 ②测试方法必须使用@Test注解标记
public class JUnitTest {
@Test
public void Testusername() {
way way = new way();
String rs = way.username("123");
//JUnit提供的断言
Assertions.assertEquals("登陆成功",rs);
}
}
class way {
public String username(String un) {
if(un.equals("123")) {
return "登陆成功";
}else
return "登陆失败";
}
}
反射
反射概述
反射是在运行时获取类的字节码文件对象,然后可以解析类中的全部成分。
反射的关键:得到编译以后的class文件对象。
获取Class对象的方法 | 说明 |
---|---|
Class c1 = Class.forName(包名+类名) | Class类中的一个静态方法 |
Class c2 = 类名.class | 直接用类名获得,最方便 |
Class c3 = 对象.getClass() | 实例化后用对象获得 |
利用反射获取构造器对象
**反射的构造器可以用于创建对象 **
public class Reflect {
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class c1 = Student.class;
//2.获取构造器对象
Constructor student = c1.getDeclaredConstructor();
//3.利用构造器对象来实例化对象
Student stu = (Student) student.newInstance();
//演示私有构造器如何获取
Class c2 = Student.class;
//1.有参构造器声明类型
Constructor student2 = c2.getDeclaredConstructor(String.class,int.class);
//2.破坏构造器私有性
student2.setAccessible(true);
student2.newInstance("jack",18);
}
}
利用反射获取成员变量对象
public class Reflect {
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class c1 = Student.class;
//2.获取Field对象
Field field = c1.getDeclaredField("age");
field.setAccessible(true);
//3.给成员变量赋值
Student student = new Student();
field.set(student,18);
//4.获取成员变量
int result = (int) field.get(student);
System.out.println(result);
}
利用反射获取方法
public class Reflect {
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class c1 = Student.class;
//2.获取Method对象
Method name = c1.getDeclaredMethod("setName", String.class);
//3.Method.invoke(对象)来调用方法
Student student = new Student();
name.invoke(student,"Jack");
}
}
反射作用:绕过编译为集合添加数据
说明:①编译成Class文件进入运行阶段后,泛型会自动擦除
②反射是作用在运行时的技术,此时已经不存在泛型了
public class Reflect {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
//无法加入String类型的变量
//list.add("Jack");
//使用放射来强行加入String(运行时)
Class d = ArrayList.class;
Method add = d.getDeclaredMethod("add", Object.class);
add.invoke(list,"Jack");
for (Object integer : list) {
System.out.println(integer);
}
}
}
//运行结果:1 2 Jack
反射作用:通用框架的底层原理
说明:①可以在运行时得到一个类的全部成分
②做Java高级框架
③可以针对不同的对象,获取他们的信息
注解
对Java中类、方法、成员变量做标记,然后进行特殊处理
自定义注解
元注解
注解注解的注解(放在注解定义上方)
常见的元注解有两个:
注解 | 说明 |
---|---|
@Target | 约束自定义注解只能在哪些地方使用 |
@Retention | 申明注解的生命周期 |
注解解析
判断是否存在注解,存在注解就解析出内容