面试干货!阿里大牛连肝了 3 个晚上,总结了 Java 基础的 13 个问题
今日分享开始啦,请大家多多指教~
1.1 单元测试
1.什么是单元测试?
答:单元测试是指程序员写的测试代码给自己类中的方法进行预期正确性的验证,单元测试一旦写好了这些测试代码,就可以一直使用,可以实现一定程度上的自动化测试。单元测试一般要使用框架进行。
2.什么是框架?
答:框架是前人或者一些牛逼的技术公司在实战或者研发中设计的一些优良的设计方案或者成型的代码功能,作为一个完整的技术体系发行出来称为框架
单元测试的经典框架: Junit
1.什么是 Junit?
答:
Junit 是 Java 语言编写的第三方单元测试框架
Junit 框架的方案可以帮我们方便且快速的测试我们的代码的正确性
2.什么是单元测试?
答:
单元:在 Java 中,一个类就是一个单元
单元测试:程序猿用 Junit 编写的一小段代码,用来对某个类中的某个方法进行功能测试或者业务逻辑测试
1.2Junit 框架使用步骤
1.下载这个框架
框架一般都是 jar 包的形式,jar 包里面都是 class 文件,class 文件就是我们调用的核心代码
2.直接用 Junit 测试代码即可
写测试类:以 Test 开头,以业务类类名结尾
业务名称:UserService
测试这个业务类的测试类:TestUserService
在测试类中写测试方法
测试方法的命名规范:以 Test 开头,以业务方法名结尾
被测试业务方法:login
测试方法名:testLogin
测试方法注意事项
必须用 public 修饰,没有返回值,没有参数
必须使用注解 @Test 修饰
1.3Junit 常用注解(4.xx 版本)
@Test 测试方法!
@Before: 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次
@After: 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次
@BeforeClass: 用来静态修饰方法,该方法会在所有测试方法之前只执行一次
@AfterClass: 用来静态修饰方法,该方法会在所有测试方法之后只执行一次
1.4Junit 常用注解(5.xx 版本)
Test 测试方法
@BeforeEach: 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次
AfterEach: 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次
BeforeAll: 用来静态修饰方法,该方法会在所有测试方法之前只执行一次
AfterAll: 用来静态修饰方法,该方法会在所有测试方法之后只执行一次
1.5 反射
反射,注解,代理,泛型是 Java 的高级技术,是以后框架的底层院里必须使用到的技术
1.什么是反射?
答:反射是指对于任何一个类,在“运行的时候”都可以直接得到这个类的全部成分
在运行时,可以直接得到这个类的构造器对象(Constructor)
在运行时,可以直接得到这个类的成员变量对象(Field)
在运行时,可以直接得到这个类的成员方法对象(Method)
2.反射的核心思想和关键就是得到:编译后的 class 文件对象
3.反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分
1.6 反射获取 Class 类对象
引入:
反射是通过先得到编译以后的 Class 类对象:字节码文件,然后才可以得到类中的全部成分,进行一些功能设计
反射为一个类的全部成分都设计了一个类型来代表这个对象
Class:字节码文件的类型
Constructor:构造器的类型
Field:成员变量的类型
Method:方法的类型
反射获取 Class 类对象:
1.反射技术的第一步永远是先得到 Class 类对象:有三种方式获取
类名.class
通过类的对象.getClass()方法
Class.forName(“类的全限名”)
public static Class<?> forName(String className)
2.Class 类下的方法
String getSimpleName(): 获得类名字符串:类名
String getName(): 获得类全名:包名 + 类名
1.7 反射获取 Constructor 构造器
反射中 Class 类型获取构造器提供了很多的 API:
Constructor getDeclaredConstructor(Class...parameterTypes)
根据参数匹配获取某个构造器,不关心权限修饰符
Constructor[] getDeclaredConstructors()
获取所有申明的构造器
1.8 反射获取构造器并初始化对象
反射获取 Constructor 构造器然后通过这个构造器初始化对象
Constructor 的 API:
T newInstance(Object... initargs): 创建对象,注入构造器需要的数据
void setAccessible(true): 修改访问权限,true 代表暴力攻破权限,false 表示保留
可以通过定位类的构造器对象
如果构造器对象没有访问权限可以通过:void setAccessible(true)打开权限
构造器可以通过 T newInstance(Object... initargs) 调用自己,传入参数
1.9 反射获取 Field 成员变量对象
Field getDeclaredField(String name): 根据成员变量名获取对应 Field 对象
Field[] getDeclaredFields(): 获得所有的成员变量对应的 Field 对象
1.10 成员变量赋值和取值
Field 的方法:给成员变量赋值和取值
void set(Object obj,Object value): 给对象注入某个成员变量数据
Object get(Object obj): 获取对象的成员变量的值
void setAccessible(true): 暴力反射,设置为可以直接访问私有类型的属性
Class getType(): 获取属性的类型,返回 Class 对象
String getName(): 获取属性的名称
1.11 反射获取 Method 方法对象
反射获取类的 Method 方法对象:
Method getDeclaredMethod(String name,Class...args)
根据方法名和参数类型获取对应的方法对象
Method[] getDeclaredMethods()
获得类中所有成员方法对象,返回数组
Method 的方法执行:
Object invoke(Object obj,Object... args)
参数一:触发的是哪个对象的方法执行
参数二:args:调用方法时传递的实际参数 v
1.12 暴力攻击集合泛型
– 反射可以破坏面向对象的封装性(暴力反射)
– 同时可以破坏泛型的约束性
1.13 反射的作用
可以在运行时得到一个类的全部成分然后操作
可以破坏封装性
可以破坏泛型的约束性
更重要的用途:适合做 Java 高级框架,基本上主流框架都会基于反射设计一些通用技术功能
今日份分享已结束,请大家多多包涵和指点!
评论