JAVA--高級基礎開發

Day11[Junit、註解、反射]

  • Junit 單元測試
    1. Junit概述:
  1. 軟件測試分爲黑盒測試和白盒測試
  • 黑盒測試:不須要寫代碼,給定輸入值,看程序可否輸出指望的值。
  • 白盒測試:  須要寫代碼,關注程序具體的執行流程。
  1. Junit 是一個java語言的單元測試框架,屬於白盒測試,簡單理解爲能夠取代main方法,Junit屬於第三方工具,須要導入jar包才能使用。
    1. Junit的使用
  2. 編寫一個測試類,簡單的理解爲取代main方法。
  3. 在測試類方法上添加註解 @Test.
  4. @Test 修飾的方法要求,public  void  方法名(){}, 方法名自定義,建議test 開頭,沒有參數。
  5. 添加Junit 架包到lib文件夾,而後進行jar包關聯。
    1. 經常使用的註解
  1. @ Test : 用於修飾要執行的方法。
  2. @Before:修飾的方法會在測試方法以前自動執行,經常使用來測試時進行數據的初始化工做。
  3. @After:修飾的方法會在測試方法執行以後自動執行,經常使用來執行後,進行資源的銷燬。

 

//Junit單元測試,必須導入架包jarjava

//Test用來進行測試代碼塊,要測試的東西放進Test類中。框架

//Before最早執行,用來初始化工具

//After最後執行,用來銷燬資源單元測試

public class Test01 {測試

 

    @Testspa

    public  void display(){.net

        System.out.println("JUNIT單元測試");設計

    }對象

    @Before繼承

    public  void  testBefore(){

        System.out.println("============初始化================");

    }

    @After

    public  void  testAfter(){

        System.out.println("============= 銷燬資源=============");

    }

}

  • 反射 框架的設計靈魂
  1. 框架,軟件的半成品,能夠在框架的基礎上進行軟件的開發。
  2. 反射: java 代碼的各個組成部分封裝爲其餘對象。能夠在運行程序過程當中操做這些對象。
  3. 反射的好處:
  • 能夠在程序運行過程當中操做這些對象。
  • 能夠解耦,提升程序的可擴展性。

2.1 獲取Class對象的方式

獲取class對象

   做用

 場景

Class.forName(「類的全限定名」)

就是包名.類名

經過指定的字符串路徑獲取

配置文件,將類名定義在配置文件中,讀取文件,加載類。

類名.Class

經過類名的屬性class獲取

用於參數的傳遞

對象.getClass

經過類名的getClass獲取

多用於對象獲取字節碼的方式

【注意】同一個字節碼文件在一次程序運行過程當中,只會被加載一次,無論經過那一種方式獲取,Class對象都是同一個。

2.2  獲取Class對象的信息

  1. Class對象相關的方法:
  • String  getSimPleName();得到簡單的類名,只有類,沒有包。
  • String  getName();  獲取完整的類名,包名+類名;
  •  T  newInstance();建立此class對象所表示類的一個新對象,可是有一個要求:類中必須包含一個public 無參數的構造方法。

//反射

public class Test02 {

    public static void main(String[]args)throws Exception{

        //建立反射的對象1

       Class   t1=Class.forName("day01.Student");

        //建立反射的對象2

       Class  t2= Student.class;

        //建立反射的對象3

        Student  student=new Student();

        Class  t3=student.getClass();

        System.out.println("獲取類名:"+t2.getSimpleName());

        System.out.println("獲取全限定名:"+t1.getName());

 

        // 建立Student對象,必須包含一個public修飾的方法。

        Student  student1=(Student)t1.getDeclaredConstructor().newInstance();

        System.out.println(student.getName());

 

        // 建立Student對象,必須包含一個public修飾的方法。

        Student   student2=(Student)t1.newInstance();

        System.out.println(student2.getAge());

 

        }

 

     }

 

2.3 Constructor類

  1. Constructor類是一個構造方法類,類中的每個構造方法都是Constructor的對象,經過Constructor對象能夠實例化對象。
  2. Class類中與Constructor相關的方法。
  • Constructor  getConstructor(Class…paramerType); 根據參數類型獲取構造方法,只能獲取public 修飾的構造方法,若是不存在對應的構造方法,則會拋出  java.lang.NoSuchMethodException 異常。(當沒法找到特定方法時拋出)。
  • Constructor  getDeclaredConstructor(Class…paramerType); 根據參數類型獲取構造方法的對象,包括Private修飾的構造方法,若是不存在對應的構造方法,則會拋出java.lang.NoSuchMethodException 異常。(當沒法找到特定方法時拋出)。
  • Constructor []  getConstructors() ;獲取全部public 修飾的構造方法。
  • Constructor[]  getDeclaredConstructors();獲取全部的構造方法,包括Private修飾的。

示例:

 

// 獲取構造方法

public class Test03 {

    public static void main(String[] args) {

 //建立Class對象

        Class  t1=Student.class;

        //獲取構造方法

        try {

            //根據參數類型獲取構造方法對象,

只能獲取public 修飾的構造方法//無參數的

            Constructor<Student>ss1=t1.getConstructor();

            System.out.println("只獲取public修飾的構造方法"+ss1);

            //根據參數類型獲取構造方法對象,只能獲取public

修飾的構造方法有參數的

            Constructor ss = t1.getConstructor(String.class,Integer.class);

            System.out.println("只獲取public修飾的構造方法:"+ss);

 

 

           //根據參數的類型獲取構造方法,獲取public 修飾的方法,

包括Private修飾的構造方法

            Constructor  ss4=t1.getDeclaredConstructor(String.class,Integer.class);

            System.out.println("獲取public和private修飾的方法:"+ss4);

 

 

            //獲取全部public修飾的方法

            Constructor[]ss3=t1.getConstructors();

            for(Constructor  c:ss3){

                System.out.println("獲取全部public修飾的全部構造方法:"+c);

            }

 

            //獲取全部的public修飾Private修飾的構造方法

             Constructor[]ss5=t1.getDeclaredConstructors();

            for(Constructor  q:ss5){

                System.out.println("獲取全部的構造方方法,包括私有的:"+q);

            }

    }

}

  1. Constuctor 類中經常使用方法
  • T  newInstance(Object... initargs);根據指定的參數建立對象。
  • java.lang.reflect.AccessibleObject 類中有一個方法爲:
  • void setAccessible(boolean flag) :暴力反射,設置爲能夠直接訪問私有類型的構造方法。括號內默認爲true;

 

// 獲取構造方法

public class Test03 {

    public static void main(String[] args) {

//建立Class對象

        Class  t1=Student.class;

//經過無參數的構造方法建立對象

         Student  student=(Student)t1.newInstance();

      System.out.println("liwenjie"+student.getName());

   

             //經過無參數的構造方法建立對象

               Student  student=(Student)ss1.newInstance();

               System.out.println("liwenjie"+student.getName());

 

               //有參數的構造方法建立對象

             Student  student1=(Student)ss4.newInstance("王智雅",23);

             System.out.println(student1.getName()+" "+student1.getAge());

 

             //暴力反射,意思就是,設置爲能夠直接訪問私有類型的構造方法

            Constructor<Student> ss7= t1.getDeclaredConstructor(String.class);

            ss7.setAccessible(true);  暴力反射~~~嘻嘻

            Student sss=ss7.newInstance("李文傑");

            System.out.println(sss.getName());

 

 

 

}

}

2.4 Method類

  1. Method 是方法類,類中的每個方法都是Method 的對象,經過Method 能夠調用方法。
  2. Class類與Method類相關的方法:::
  • Method  getMethod(String name, Class<?>... parameterTypes):根據參數類型和方法名得到一個對象,只能得到public 修飾的方法。
  • Method[]getMethods():獲取全部的 public 修飾的成員方法,包括父類中。
  • Method getDeclaredMethod(String name, Class<?>... parameterTypes):根據方法名和參數類型得到一個方法對象,包括public和private 修飾的方法。
  • Method[]getDeclaredMethods():獲取當前類中全部的方法,包括Private私有的,可是不包括父類中。

示例:

 

//Method 方法

public class Test05 {

    public static void main(String[] args)throws Exception {

 

        //建立Class對象

        Class<Student> studentClass=Student.class;

 

        //根據方法名和參數類型得到一個方法對象,只能獲取public修飾的方法

        Method  method=studentClass.getMethod("setName", String.class);

        System.out.println("只能獲取public修飾的方法"+method);

 

        //Method[]getMethods()獲取全部的public修飾的成員方法,包括父類中

          Method[]methods=studentClass.getMethods();

          for(Method  ss:methods){

              System.out.println("獲取全部public修飾的成員方法:"+ss);

          }

 

           //Method getDeclaredMethod(String name, Class<?>... parameterTypes):

          //根據方法名和參數類型得到一個方法對象,包括private修飾的方法

          Method  method1=studentClass.getDeclaredMethod("setName", String.class);

         //根據參數類型和方法名獲取

          System.out.println("獲取public和private修飾的方法:"+method1);

 

         //Method[]getDeclaredMethods():

        // 獲取當前類中全部的方法,包括私有的,但不包括父類中

         Method[]method2=studentClass.getDeclaredMethods();

         for(Method  ff:method2){

             System.out.println("==獲取全部的包括私有的方法==:"+ff);

         }

    }

 

}

  1. Method類中經常使用的方法
  • Object invoke(Object obj, Object... args):根據參數 args 調用對象 obj 的成員方法,若是obj=null,則表示方法時靜態方法

 

//Method 經常使用的方法

public class Test04 {

    public static void main(String[] args)throws Exception{

 //建立Class對象

        Class  ss=Student.class;

        Method  method=ss.getDeclaredMethod("setName", String.class);

        //暴力反射,訪問私有的方法

        method.setAccessible(true);

        method.invoke(ss.getConstructor().newInstance(),"李文傑");

    }

}

2.5 Field 類

  1. Field類表示成員屬性,類中的每一個成員屬性都是Field的實例,
  2. Class中提供的方法:
  • Field  getField(String name): 根據指定的名稱獲取成員屬性,只能獲取public修飾的。
  • Field[]  getFields() : 獲取全部public 修飾的成員屬性,包括從父類繼承的。
  • Field  getDeclaredField(String name): 根據指定的名稱獲取屬性,包括Private修飾。
  • Field[]  getDeclaredFields() : 獲取全部的屬性,不包括父類繼承的。

 

 

//Field 類

public class Test06 {

    public static void main(String[] args)throws Exception {

        //建立對象

        Class<Student>studentClass=Student.class;

        //getField(String name);

        // 根據指定的名稱獲取成員屬性,只能獲取public修飾的

        Field  field=studentClass.getField("name");

        System.out.println("只獲取public修飾的"+field);

 

        //Field[]  getFields() : 獲取全部public 修飾的成員屬性,包括從父類繼承的

          Field[]fields=studentClass.getFields();

          for(Field  ss:fields){

             System.out.println("全部public修飾的屬性:"+ss.getName());

          }

 

          //Field getDeclaredField(String name)

        //根據本指定的名稱獲取屬性,包括私有的屬性。

         Field  field1=studentClass.getDeclaredField("age");

          System.out.println("private"+field1);

         Field  field2=studentClass.getDeclaredField("name");

         System.out.println("public"+field2);

 

 //Field[] getDeclaredFields();

        //獲取全部的屬性,可是不包括父類繼承的。

        Field[]fields1=studentClass.getDeclaredFields();

        for(Field  ff:fields1){

           System.out.println("====public和private==="+ff);

        }

    }

}

 

  1. Field經常使用的方法:
  • String  getName():返回由此 Field對象表示的字段的名稱。 
  • Object  get(Object obj) : 獲取屬性的值。
  • void  set(Object obj, Object value):將指定參數上的此field對象表示的字段,設置爲指定的新值。

 

//Field類經常使用的方法。

public class Test07 {

    public static void main(String[] args)throws Exception{

 

        Class<Student>student=Student.class;

        Student  student1=student.getConstructor().newInstance();

        Field field=student.getField("name");

        field.set(student1,"李文傑");

        System.out.println(field.get(student1));

 

        //獲取全部的屬性,包括Private屬性

        Field[]fields=student.getFields();

        for(Field  ss:fields){

            //給屬性設置值

            System.out.println(ss.getGenericType().getTypeName()+" "+ss.getName());

            ss.setAccessible(true);

            System.out.println(ss.get(student.getConstructor().newInstance()));

        }

    }

}

相關文章
相關標籤/搜索