java反射机制和junit的使用
1. 反射的原理
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。
-
應用在一些通用性比較高的代碼中
-
后面學到的框架,大多數都是使用反射來實現的
-
在框架開發中,都是基于配置文件開發
-
在配置文件中配置了類,可以通過反射得到類中的所有內容,可以讓類中的某個方法來執行
-
類中的所有內容:屬性、沒有參數的構造方法、有參數的構造方法、普通方法
畫圖分析反射的原理
首先需要把java文件保存到本地硬盤 .java
編譯java文件,成.class文件
使用jvm,把class文件通過類加載加載到內存中
萬事萬物都是對象,class文件在內存中使用Class類表示
當使用反射時候,首先需要獲取到Class類,得到了這個類之后,就可以得到class文件里面的所有內容,包含屬性、構造方法和普通方法。
2. 使用反射操作類里面的無參構造方法
public class Student {private String name;private int age; ?public Student() {super();} ?public Student(String name, int age) {super();this.name = name;this.age = age;} ?public String getName() {return name;} ?public void setName(String name) {this.name = name;} ?public int getAge() {return age;} ?public void setAge(int age) {this.age = age;} ?public void show() {System.out.println("show");} ?public void method(int x, int y) {System.out.println(x + "method" + y);} }測試類:
@Testpublic void test1() throws Exception {// 得到ClassClass clazz = Class.forName("com.yfy.Student");// 獲取無參構造方法Student s = (Student) clazz.newInstance();s.setName("張三");s.setAge(20);System.out.println(s.getName() + "--" + s.getAge());}3. 使用反射操作有參數的構造方法
@Testpublic void test2() throws Exception {// 得到ClassClass clazz = Class.forName("com.yfy.Student");// 使用有參數的構造方法// c1.getConstructors();//獲取所有的構造方法// 傳遞是有參數的構造方法里面參數類型,類型使用class形式傳遞Constructor con = clazz.getConstructor(String.class, int.class);// 通過有參數的構造方法創建Student實例Student s = (Student) con.newInstance("李四", 18);System.out.println(s.getName() + "--" + s.getAge());}4. 使用反射操作屬性
@Testpublic void test3() throws Exception {// 得到ClassClass clazz = Class.forName("com.yfy.Student");// 獲取Student類中的字段,包括私有Field field = clazz.getDeclaredField("name");// 對私有字段的訪問取消權限檢查。暴力訪問。field.setAccessible(true);Student s = (Student) clazz.newInstance();// 給s對象的name屬性賦值field.set(s, "王五");//得到該字段在s對象中的屬性值System.out.println(field.get(s));}5. 使用反射操作普通方法
@Testpublic void test4() throws Exception {// 得到ClassClass clazz = Class.forName("com.yfy.Student");// 獲取帶參數的構造方法Constructor con = clazz.getConstructor(String.class, int.class);Student s = (Student) con.newInstance("李四", 18);//獲取類中的帶參方法Method method=clazz.getMethod("method", int.class,int.class);//調用帶參方法method.invoke(s, 3,7);//獲取類中的無參方法Method method1=clazz.getMethod("show");//調用無參方法method1.invoke(s);}-
getDeclaredMethod(方法名稱,方法里面參數的類型):得到任意一個方法,包括私有
-
getDeclaredMethods():得到所有方法,包括私有。
-
setAccessible(true):對私有方法取消權限檢查。
6. junit的使用
JUnit 是一個 Java 編程語言的單元測試框架。JUnit 在測試驅動的開發方面有很重要的發展,是起源于 JUnit 的一個統稱為 xUnit 的單元測試框架之一。
junit注解
@Test:這個注釋說明依附在 JUnit 的 public void 方法可以作為一個測試案例。
@Before:有些測試在運行前需要創造幾個相似的對象。在 public void 方法加該注釋是因為該方法需要在 test 方法前運行。
@After:如果你將外部資源在 Before 方法中分配,那么你需要在測試運行后釋放他們。在 public void 方法加該注釋是因為該方法需要在 test 方法后運行。
@BeforeClass:在 public void 方法加該注釋是因為該方法需要在類中所有方法前運行。
@AfterClass:它將會使方法在所有測試結束后執行。這個可以用來進行清理活動。
@Ignore:這個注釋是用來忽略有關不需要執行的測試的。
執行過程
-
beforeClass(): 方法首先執行,并且只執行一次。
-
afterClass():方法最后執行,并且只執行一次。
-
before():方法針對每一個測試用例執行,但是是在執行測試用例之前。
-
after():方法針對每一個測試用例執行,但是是在執行測試用例之后。
-
在 before() 方法和 after() 方法之間,執行每一個測試用例。
斷言
unit所有的斷言都包含在 Assert 類中。
這個類提供了很多有用的斷言方法來編寫測試用例。只有失敗的斷言才會被記錄。Assert 類中的一些有用的方法列式如下:
| assertEquals(boolean expected, boolean actual) | 檢查兩個變量或者等式是否平衡 |
| assertTrue(boolean expected, boolean actual) | 檢查條件為真 |
| assertFalse(boolean condition) | 檢查條件為假 |
| assertNotNull(Object object) | 檢查對象不為空 |
| assertNull(Object object) | 檢查對象為空 |
| assertSame(boolean condition) | 檢查兩個相關對象是否指向同一個對象 |
| assertNotSame(boolean condition) | 檢查兩個相關對象是否不指向同一個對象 |
| assertArrayEquals(expectedArray, resultArray) | 檢查兩個數組是否相等 |
總結
以上是生活随笔為你收集整理的java反射机制和junit的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK5的一些新特性
- 下一篇: TomCat服务器和Web应用