//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("============= 銷燬資源============="); } } |
獲取class對象 |
做用 |
場景 |
Class.forName(「類的全限定名」) 就是包名.類名 |
經過指定的字符串路徑獲取 |
配置文件,將類名定義在配置文件中,讀取文件,加載類。 |
類名.Class |
經過類名的屬性class獲取 |
用於參數的傳遞 |
對象.getClass |
經過類名的getClass獲取 |
多用於對象獲取字節碼的方式 |
【注意】同一個字節碼文件在一次程序運行過程當中,只會被加載一次,無論經過那一種方式獲取,Class對象都是同一個。
//反射 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());
}
}
|
示例:
// 獲取構造方法 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); } } } |
// 獲取構造方法 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());
} } |
示例:
//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); } }
} |
//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(),"李文傑"); } } |
//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); } } } |
//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())); } } } |