JAVASE——反射、注解、动态代理

目录

单元测试

Junit单元测试框架

反射

 获取Class对象

反射获取类中的成分并操作

作用、应用场景

注解

概述

自定义注解

元注解

注解的解析


单元测试

就是针对最小的功能单元:方法,编写测试代码对其进行正确性测试

Junit单元测试框架

优点:

  • 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立
  • 不需要去分析测试的结果,会自动生成测试报告出来

 具体步骤

  1. 将Junit框架的jar包导入到项目中
  2. 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(公共、无参、无返回值)
  3. 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
  4. 开始测试:选中测试方法,右键选择“Junit运行”,如果测试通过则是绿色;失败则是红色。

反射

反射:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。

  1. 加载类,获取类的字节码:class对象
  2. 获取类的构造器:Constructor对象
  3. 获取类的成员变量:Field对象
  4. 获取类的成员方法:Method对象

 获取Class对象

三种方式

Class c1 = 类名.class

调用Class提供方法:public static Class forName(String package);

Object提供的方法:public Class getClass(); Class c3 = 对象.getClass();

Student是提前写好的一个类
1、获取类本身:类.class
Class c1 = Student.class;

2、获取类本身:Class.forName("类的全类名")
Class c2 = Class,forName("全类名");

3、获取类本身:对象.getClass()
Student s = new Student();
Class c3 = s.getClass();

反射获取类中的成分并操作

public void getClassInfo(){
    //目标:获取类的信息
    //1、反射第一步:获取Class对象,代表拿到类
    Class c1 = Student.ckass;
    System.out.println(c1.getName());//类名的全类名
    System.out.println(c1.getSimpleName());//类名:Student
}

//2、获取类的构造器对象并对其进行操作
public void getConstructorInfo(){
    //目标:获取类的构造器对象并对其进行操作
    //1、反射第一步:获取Class对象,代表拿到类
    Class c1 = Student.ckass;
    //2、获取构造器对象
    Constructor[] cons = c1.getDeclaredConstructors();
    for ( Constructor con : cons) {
        System.out.println(con.getName() + "(" + con.getParameterCount() + ")");
    }
    //3、获取单个构造器
    Constructor con = c1.getDeclaredConstructor();//无参数构造器
    System.out.println(con.getName() + "(" + con.getParameterCount() + ")");

    Constructor con2 = c1.getDeclaredConstructor(String.class, int.class);//有参数构造器
    System.out.println(con.getName() + "(" + con.getParameterCount() + ")");

    //4、获取构造器的作用依然是创建对象,创建对象
    //暴力反射:暴力反射可以访问私有构造器,直接访问
    con.setAccessible(true);//绕过访问权限,直接访问
    Dog d1 = (Dog) con.newInstance();
    System/put.println(d1);
}

//2、获取类的成员变量对象并对其进行操作
public void getFieldInfo(){
    //目标:获取类的构造器对象并对其进行操作
    //1、反射第一步:获取Class对象,代表拿到类
    Class c1 = Dog.ckass;
    //2、获取成员变量对象
    Field[] fields = c1.getDeclaredFields();
    for ( Field filed : fields) {
        System.out.println(field.getName() + "(" + field.getType().getName() + ")");
    }
    //3、获取单个成员变量对象
    Field field = c1.getDeclaredField("hobby");
    System.out.println(field.getName() + "(" + field.getType().getName() + ")");
}

invoke();触发某个对象的该方法执行

setAccessible(true);暴力反射。 

作用、应用场景

可以得到一个类的全部成分然后操作

可以破坏封装性

可以绕过泛型的约束

反射是做框架的通用技术

注解

概述

java代码里特殊标记,比如:@Override、@Test等,作用:让其他程序根据注解信息来决定怎么执行该程序。

自定义注解

public @interface 注解名称 {
    public 属性类型 属性名() default 默认值;
}

特殊属性名:value

如果注解中只有一个value属性,使用注解时,value名称可以不写 

元注解

注解注解的注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
}

@Target:声明被修饰的注解只能在哪些位置使用

@Retention:声明注解的保留周期 

注解的解析

判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。

要解析谁上面的注解,就应该先拿到谁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值