JAVA高级技术入门(单元测试,反射,注解,动态代理)
一、Junit单元测试
Junit单元测试笔者在前文已详细讲解,如果感兴趣的话可以关注笔者的上一篇文章
二、反射
1.认识反射,获取类
概念:
加载类。并允许以编程的方式解剖类中的各种成分(成员变量,方法,构造器等)
快速入门:
- 加载类,获取类的字节码:Class对象
- 获取类的构造器:Constructor对象
- 获取类的成员变量:Field对象
- 获取类的成员方法:Method对象
获取Class对象的三种方式
- Class c1=类名.class
- 调用Class提供的方法:public static Class forName(String package);
- Object提供的方法:public Class getClass(); Class c3=对象.getClass();

2.1获取类的构造器


注意:获得有参数的构造器时,参数为对于类型的Class类,如String.class,int.class
2.2获取类的构造器的作用:依然是初始化对象返回


注意:反射会破坏封装性!!!
3.1获取类的成员变量

3.2获取类的成员变量的作用:依然是赋值,取值


4.1获取类的成员方法


4.2获取类的成员方法的作用


5.作用,应用场景
反射的作用
- 基本作用:可以得到一个类的全部成分然后操作
- 可以破坏封装性
- 最重要的用途:适合做Java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能
三、注解
1.认识注解
- 就是Java代码中的特殊标记,比如:@Override,@Test,作用是:让其它程序根据注解信息来决定怎么执行该程序
- 注意:注解可以在类上,构造器上,方法上,成员变量上,参数上,等位置处
2.自定义注解
public @interface 注解名称 {
public 属性类型 属性名() default 默认值 ;
}
特殊属性名:value:
- 如果注解中只有一个value属性,使用注解时,value名称可以不写!!

注意序号1和序号2作用相同
3.注解的原理
- 注解本身是一个接口,Java中所有的注解都是继承了Annotation接口的
- @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口
4.元注解
(1) @Target

(2).@Retention

5.注解的解析
什么是注解的解析?
- 就是判断类上,方法上,成员变量上是否存在注解,并把注解里的内容解析出来
如何解析注解?

6.注解的应用场景
模拟Junit框架
需求:
- 定义若干个方法,只要加了MyTest注解,就会自动触发该方法执行
分析:
- 定义一个自定义注解MyTest,只能注解方法,存活范围为一直都在
- 定义若干个方法,部分方法加上@MyTest注解修饰,部分方法不加
- 模拟一个Junit程序,可以触发加了@MyTest注解的方法执行
具体操作:
1.创建一个@MyTest注解

2.创建Annotation测试类
其中创建了4个测试方法,其中test2和test4加上了注解,其他未加

3.创建main方法,实现模拟@Test注解
主要原理是利用反射遍历Annotation中的所有方法
解析每个方法上是否有@MyTest注解,
若有,则执行当前方法允许,
若无,则不执行
这样就成功模拟了@Test测试注解

4.结果
可以看到成功实现了模拟@Test注解

四、动态代理
什么是动态代理
代理类通常会持有一个委托类对象,代理类不会自己实现真正服务,而是通过调用委托类对象的相关方法,来提供服务,所以其实我们调用的还是委托类的服务,但是中间隔了一个代理类
总结
关于Java的这些高级技术可能在平常编写简单程序的时候不会用到,但事实上,在Java工程化项目中,这些都是最基础的知识点,大家一定要学好这部分知识,才能在Java工程化项目的底层原理面前游刃有余。