【Java】Junit、反射和注解的笔记
1 Junit
黑盒測試:不需要寫代碼,給輸入值,看程序輸出是否符合期望
白盒測試:需要寫代碼,關注程序具體的執行流程
Junit —> 白盒測試
步驟
【命名:類名+Test】【包名:xxx.xx.xx.test】
【命名:test+測試的方法】【返回值:void】【參數列表:空參】
判斷結果
5. 斷言:Assert.assertEquals(expected,result);
6. 紅失敗,綠成功
@Before注解,所有測試方法前會先執行,初始化申請資源方法可以用
@After注解,所有測試方法執行后執行,釋放資源方法可以用
2 反射
反射:框架設計的靈魂,將類的各個組成成分
框架:半成品軟件,可以在框架的基礎上進行軟件的開發,簡化編碼
Java代碼在計算機中經歷的三個階段
Java文件 —> Javac編譯 —>class文件【Source源代碼階段】 —> 類加載器Class.Loader —> Class類對象 【Class類對象階段】—> 創建對象 —> Xxxx對象 【Runtime運行時階段】
反射的好處:
獲取字節碼Class對象的三種方式
同一個字節碼文件**.class文件在一次程序運行中,只會被加載一次,無論通過哪一種方式獲取的Class對象都是同一個。
方法1多用于配置文件,將類名定義在配置文件中,讀取文件,加載類
方法2多用于參數的傳遞
方法3多用于對象的獲取字節碼的方式
class對象的功能
獲取的是全類名
public static void main(String[] args) {Class cls = Person.class;String name = cls.getName();System.out.println(name);//reflect.Person}案例:框架類
在不改變該類的任何代碼的前提下,可以幫助我們創建任意類的對象并執行任意方法
實現:1. 配置文件 2.反射
步驟:
創建配置文件 xxx.properties
修改配置文件就可以選擇使用的類和方法
運行執行的是配置文件里對應的類和類的方法
3 注解
定義:Annotation,也叫元數據,一種代碼級別的說明,JDK1.5后的新特性,與類、接口、枚舉在同一層子,可以聲明在包、類、字段、方法、局部變量和方法參數等前面,用來對這些元素進行說明,注釋。
概念:JDK1.5之后的新特性,用來說明程序
作用分類:
JDK的內置注解
自定義注解
- 格式:
元注解
public @interface 注解名稱{}
注解的本質:是一個接口 默認繼承自Annotation接口
public interface javadoc.MyAnno extends java.lang.annotation.Annotation {}
注解的屬性:接口中的抽象方法
要求:
元注解:用來描述注解的注解
- @Target:描述注解能夠作用的位置
ElementType的取值:
TYPE:可以作用于類上
METHOD:可以作用于方法上
FILED:可以作用于成員變量上
- @Retention:描述注解被保留的階段
RetentionPolicy的取值:
RUNTIME:當前被描述的注解,會保留到class字節碼文件中,并被JVM讀取到。
CLASS:
SOURCE:
- @Documented:描述注解是否被抽取到api文檔中
- @Inherited:描述注解是否被子類繼承
解析注解
Pro annotation = reflectTestClass.getAnnotation(Pro.class);
定義注解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Pro {String className();String methodName(); }自定義類
public class Demo01 {public void show(){System.out.println("demo1...show");} }定義框架類
@Pro(className = "reflect.Demo01",methodName = "show") public class ReflectTest {//在不改變該類的任何代碼的前提下,可以幫助我們創建任意類的對象并執行任意方法public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {//1.解析注解//1.1 獲取該類的字節碼文件對象Class<ReflectTest> reflectTestClass = ReflectTest.class;//2.獲取注解對象,在內存中生產了一個該注解接口的子類實現對象/*public class ProImpl implements Pro{public String className(){return "reflect.Demo01";}public String methodName(){return "show";}}*/Pro annotation = reflectTestClass.getAnnotation(Pro.class);//3.調用注解對象中定義的抽象方法獲取返回值String className = annotation.className();String methodName = annotation.methodName();System.out.println(className);System.out.println(methodName);//4.加載類進內存Class cls = Class.forName(className);//5.創建對象Object obj = cls.newInstance();//6.獲取方法對象Method method = cls.getMethod(methodName);method.invoke(obj);} }注解案例:簡單的測試框架
定義Check注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Check { }定義類
package demo;public class Calculator {//加法@Checkpublic void add(){String str = null;str.toString();System.out.println("1 + 0 =" + (1 + 0));}//減法@Checkpublic void sub(){System.out.println("1 - 0 =" + (1 - 0));}//乘法@Checkpublic void mul(){System.out.println("1 * 0 =" + (1 * 0));}//除法@Checkpublic void div(){System.out.println("1 / 0 =" + (1 / 0));}public void show(){System.out.println("no bug...");} }測試類-解析程序
public class TestCheck {public static void main(String[] args) throws IOException {//1.創建計算器對象Calculator c = new Calculator();//2.獲取字節碼文件對象Class cls = c.getClass();//3.獲取所有方法Method[] methods = cls.getMethods();BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));//4.判斷方法上是否有check注解int num = 0;for(Method method: methods){if(method.isAnnotationPresent(Check.class)){//5.有就執行方法try{method.invoke(c);//6.捕獲異常}catch (Exception e){num++;bw.write(method.getName()+"方法出異常了");bw.newLine();bw.write("異常的名稱:"+ e.getCause().getClass().getSimpleName());bw.newLine();bw.write("異常的原因:"+e.getCause().getMessage());bw.newLine();bw.write("-----------------------------");bw.newLine();}}}bw.write("本次測試一共出現了"+num+"次異常");bw.flush();bw.close();} }bug.txt文件
add方法出異常了
異常的名稱:NullPointerException
異常的原因:null
-----------------------------
div方法出異常了
異常的名稱:ArithmeticException
異常的原因:/ by zero
-----------------------------
本次測試一共出現了2次異常
4 小結
總結
以上是生活随笔為你收集整理的【Java】Junit、反射和注解的笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: 【JavaWeb】JDBC优化 之 数据