小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

測(cè)試,反射,注解

 印度阿三17 2020-03-15

測(cè)試,反射,注解

1.junit測(cè)試

1.1流程

  1. 創(chuàng)建測(cè)試包 xxx.xxx.xx.test
  2. 創(chuàng)建測(cè)試類 xxxTest
  3. 創(chuàng)建測(cè)試方法 testxxxx(),返回值void,參數(shù)無,為保證測(cè)試方法可以獨(dú)立運(yùn)行,必須使用@Test進(jìn)行注解,同時(shí)添加@Test的依賴
  4. 編寫測(cè)試代碼
  5. 使用Assert進(jìn)行斷言
  6. 查看測(cè)試結(jié)果:紅色,失?。痪G色,成功

1.2擴(kuò)展的注解

  • @Before:如初始化init,在所有測(cè)試用例之前執(zhí)行
  • @After:如關(guān)閉資源close,在所有測(cè)試用例之后執(zhí)行

2.反射

2.1獲取字節(jié)碼文件的三種方式

  1. Class.forName(“全類名”):將字節(jié)碼文件加載進(jìn)內(nèi)存,返回Class對(duì)象
    * 多用于配置文件,將類名定義在配置文件中。讀取文件,加載類

  2. 類名.class:通過類名的屬性class獲取
    * 多用于參數(shù)的傳遞

  3. 對(duì)象.getClass():getClass()方法在Object類中定義著。
    * 多用于對(duì)象的獲取字節(jié)碼的方式

    結(jié)論:
    同一個(gè)字節(jié)碼文件(*.class)在一次程序運(yùn)行過程中,只會(huì)被加載一次,不論通過哪一種方式獲取的Class對(duì)象都是同一個(gè)。

2.2class功能

  1. 獲取成員變量們

? * Field[] getFields() :獲取所有public修飾的成員變量

? * Field getField(String name) 獲取指定名稱的 public修飾的成員變量

? * Field[] getDeclaredFields() 獲取所有的成員變量,不考慮修飾符

? * Field getDeclaredField(String name)

  1. 獲取構(gòu)造方法們

? * Constructor<?>[] getConstructors()

? * Constructor getConstructor(類<?>… parameterTypes)

? * Constructor getDeclaredConstructor(類<?>… parameterTypes)

? * Constructor<?>[] getDeclaredConstructors()

  1. 獲取成員方法們:

? * Method[] getMethods()

? * Method getMethod(String name, 類<?>… parameterTypes)

? * Method[] getDeclaredMethods()

? * Method getDeclaredMethod(String name, 類<?>… parameterTypes)

  1. 獲取全類名

? * String getName()

2.3獲取file方法

獲取該類的成員變量方法

  1. 批量的
  • Field[] getFields():獲取所有的"公有字段"
  • Field[] getDeclaredFields():獲取所有字段,包括:私有、受保護(hù)、默認(rèn)、公有;
  1. 獲取單個(gè)的:
  • public Field getField(String fieldName):獲取某個(gè)"公有的"字段;

  • public Field getDeclaredField(String fieldName):獲取某個(gè)字段(可以是私有的)

  1. 設(shè)置值
    * void set(Object obj, Object value) 執(zhí)行前先創(chuàng)建對(duì)象,傳入對(duì)象
  2. 獲取值
    * get(Object obj)
  3. 忽略訪問權(quán)限修飾符的安全檢查,可以訪問私有等的代碼
    * setAccessible(true):暴力反射

2.4獲取Constructor

Constructor:構(gòu)造方法

獲取構(gòu)造方法們
* Constructor<?>[] getConstructors()
* Constructor getConstructor(類<?>… parameterTypes)

  • Constructor getDeclaredConstructor(類<?>… parameterTypes)
    * Constructor<?>[] getDeclaredConstructors()

  • 創(chuàng)建對(duì)象:
    * T newInstance(Object… initargs)

? * 如果使用空參數(shù)構(gòu)造方法創(chuàng)建對(duì)象,操作可以簡(jiǎn)化:Class對(duì)象的newInstance方法

2.5獲取Method

  1. 獲取方法名稱:
    * String getName:獲取方法名

? * Method[] getMethods()
? * Method getMethod(String name, 類<?>… parameterTypes)

? * Method[] getDeclaredMethods()
? * Method getDeclaredMethod(String name, 類<?>… parameterTypes)

  1. Method:方法對(duì)象
    * 執(zhí)行方法:
    * Object invoke(Object obj, Object… args) 執(zhí)行前先創(chuàng)建對(duì)象,傳入對(duì)象

?

3.注解

jdk1.5之后新特性,說明程序的

作用分類:
①編寫文檔:通過代碼里標(biāo)識(shí)的注解生成文檔【生成文檔doc文檔】
②代碼分析:通過代碼里標(biāo)識(shí)的注解對(duì)代碼進(jìn)行分析【使用反射】
③編譯檢查:通過代碼里標(biāo)識(shí)的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】

  • jdk中預(yù)定義的注解

    ? * @Override :檢測(cè)被該注解標(biāo)注的方法是否是繼承自父類(接口)的
    ? * @Deprecated:該注解標(biāo)注的內(nèi)容,表示已過時(shí)
    ? * @SuppressWarnings:壓制警告
    ? * 一般傳遞參數(shù)all @SuppressWarnings(“all”)

      		1.deprecation:使用了不贊成使用的類或方法時(shí)的警告(使用@Deprecated使得編譯器產(chǎn)生的警告);
    

    2.unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,例如當(dāng)使用集合時(shí)沒有用泛型 (Generics) 來指定集合保存的類型; 關(guān)閉編譯器警告

    3.fallthrough:當(dāng) Switch 程序塊直接通往下一種情況而沒有 Break 時(shí)的警告;

    4.path:在類路徑、源文件路徑等中有不存在的路徑時(shí)的警告;

    5.serial:當(dāng)在可序列化的類上缺少 serialVersionUID 定義時(shí)的警告;

    6.finally:任何 finally 子句不能正常完成時(shí)的警告;

    7.all:關(guān)于以上所有情況的警告。

3.1自定義注解

屬性:接口中的抽象方法
* 要求:

  1. 屬性的返回值類型有下列取值
    * 基本數(shù)據(jù)類型
    * String
    * 枚舉
    * 注解
    * 以上類型的數(shù)組

  2. 定義了屬性,在使用時(shí)需要給屬性賦值

              1. 如果定義屬性時(shí),使用default關(guān)鍵字給屬性默認(rèn)初始化值,則使用注解時(shí),可以不進(jìn)行屬性的賦值。
              1. 如果只有一個(gè)屬性需要賦值,并且屬性的名稱是value,則value可以省略,直接定義值即可。
              1. 數(shù)組賦值時(shí),值使用{}包裹。如果數(shù)組中只有一個(gè)值,則{}可以省略
    

    元注解:用于描述注解的注解
    * @Target:描述注解能夠作用的位置
    * ElementType取值:
    * TYPE:可以作用于類上
    * METHOD:可以作用于方法上
    * FIELD:可以作用于成員變量上
    * @Retention:描述注解被保留的階段
    * @Retention(RetentionPolicy.RUNTIME):當(dāng)前被描述的注解,會(huì)保留到class字節(jié)碼文件中,并被JVM讀取到
    * @Documented:描述注解是否被抽取到api文檔中
    * @Inherited:描述注解是否被子類繼承

  • 格式:

? 元注解

? public @interface 注解名稱{

? 屬性列表;

? }

? * 本質(zhì):注解本質(zhì)上就是一個(gè)接口,該接口默認(rèn)繼承Annotation接口

? * public interface MyAnno extends java.lang.annotation.Annotation {}

補(bǔ)充

1.@Retention: 定義注解的保留策略

@Retention(RetentionPolicy.SOURCE) //注解僅存在于源碼中,在class字節(jié)碼文件中不包含

@Retention(RetentionPolicy.CLASS) // 默認(rèn)的保留策略,注解會(huì)在class字節(jié)碼文件中存在,但運(yùn)行時(shí)無法獲得,

@Retention(RetentionPolicy.RUNTIME) // 注解會(huì)在class字節(jié)碼文件中存在,在運(yùn)行時(shí)可以通過反射獲取到

首 先要明確生命周期長(zhǎng)度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在運(yùn)行時(shí)去動(dòng)態(tài)獲取注解信息,那只能用 RUNTIME 注解;如果要在編譯時(shí)進(jìn)行一些預(yù)處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS注解;如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,則可選用 SOURCE 注解。

2.@Target:定義注解的作用目標(biāo)

源碼為:

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Target {

ElementType[] value();

}

@Target(ElementType.TYPE) //接口、類、枚舉、注解

@Target(ElementType.FIELD) //字段、枚舉的常量

@Target(ElementType.METHOD) //方法

@Target(ElementType.PARAMETER) //方法參數(shù)

@Target(ElementType.CONSTRUCTOR) //構(gòu)造函數(shù)

@Target(ElementType.LOCAL_VARIABLE)//局部變量

@Target(ElementType.ANNOTATION_TYPE)//注解

@Target(ElementType.PACKAGE) ///包

3.@Document:說明該注解將被包含在javadoc中

4.@Inherited:說明子類可以繼承父類中的該注解

3.2注解解析

在程序使用(解析)注解:獲取注解中定義的屬性值

? 1. 獲取注解定義的位置的對(duì)象 (Class,Method,Field)

? 2. 獲取指定的注解

? * getAnnotation(Class)

? //其實(shí)就是在內(nèi)存中生成了一個(gè)該注解接口的子類實(shí)現(xiàn)對(duì)象

? public class ProImpl implements Pro{

? public String className(){

return “cn.itcast.annotation.Demo1”;

? }

? public String methodName(){

? return “show”;

? }

? }

? 3. 調(diào)用注解中的抽象方法獲取配置的屬性值

來源:https://www./content-4-660301.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多