单元测试、反射、注解、动态代理

单元测试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);
    }
}

利用反射获取成员变量对象

Field类中取值赋值方法

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 申明注解的生命周期

Retention注解说明

注解解析

判断是否存在注解,存在注解就解析出内容

posted @ 2022-08-05 23:03  科班小白  阅读(87)  评论(1编辑  收藏  举报