單元測試
? ? ? ? ?就是針對最小的功能單元(方法),編寫測試代碼對其進(jìn)行正確性測試。
咱們之前是如何進(jìn)行單元測試的?有啥問題 ??
?
Junit單元測試框架?
? ? ? ? ? 可以用來對方法進(jìn)行測試,它是由Junit公司開源出來的?
具體步驟?
?Junit框架的常見注解
public class StringUtilTest {
@Test
@Before
public void testPrintNumber(){
StringUtil.printNumber("哈哈");
StringUtil.printNumber(null);
}
@Test
public void testGetMaxIndex(){
int sum = new StringUtil().getMaxIndex("蝙蝠俠不打你了");
System.out.println(sum);
Assert.assertEquals("警告,警告",6,sum);
}
@Test
@After
public void testPrint(){
System.err.println("結(jié)束");
}
}
?反射(Reflection)
? ? ? ? ? 反射就是:加載類,并允許以編程的方式解剖類中的各種成分(成員變量、方法、構(gòu)造器等)。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
反射學(xué)什么??
?
獲取Class對象的三種方式?
1.直接使用類名.class獲取:Class c1 = 類名.class
2.調(diào)用Class提供的方法:Class c2 = Class.forName("全類名")
3.調(diào)用Object提供的方法:Class c3 = 對象.getClass()?
public class Demo1 {
@Test
public void testDemo01() throws ClassNotFoundException {
Class catClass = Cat.class;
System.out.println(catClass.getName());
Class aClass = Class.forName("com.itheima.b_反射.Cat");
System.out.println(aClass);
Class aClass1 = new Cat().getClass();
System.out.println(aClass1);
}
}
?獲取類的構(gòu)造器
?
/*
獲取構(gòu)造器[下面是Class的方法]
Constructor<?>[] getConstructors() 獲取所有的公共構(gòu)造器(只能獲取public修飾的)
Constructor<?>[] getDeclaredConstructors() 獲取全部構(gòu)造器(只要存在就能拿到)
Constructor<T> getConstructor(Class<?>... parameterTypes) 獲取某個公共構(gòu)造器(只能獲取public修飾的)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 獲取某個構(gòu)造器(只要存在就能拿到)
使用構(gòu)造器(創(chuàng)建對象)[下面是Constructor的方法]
T newInstance(Object... initArgs) 調(diào)用此構(gòu)造器對象表示的構(gòu)造器,并傳入?yún)?shù),完成對象的初始化并返回
public void setAccessible(boolean flag) 設(shè)置為true,表示禁止檢查訪問控制(暴力反射)
注意
使如果想使用private修飾構(gòu)造器反射創(chuàng)建對象,需要暴力反射(禁止JVM檢查構(gòu)造方法的訪問權(quán)限)
*/
public class Demo2 {
@Test
public void testConstructor() throws NoSuchMethodException {
Class<Cat> clazz = Cat.class;
//獲取全部構(gòu)造器(public)
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
System.out.println("====================================");
Constructor<Cat> constructor = clazz.getConstructor();
System.out.println(constructor);
System.out.println("===============================");
Constructor<Cat> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);
System.out.println("方法名:" + declaredConstructor.getName() + "參數(shù)個數(shù):"+ declaredConstructor.getParameterCount());
}
@Test
public void testNew() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class calazz = Cat.class;
Constructor declaredConstructor = calazz.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);
Cat 加菲貓 = (Cat)declaredConstructor.newInstance("加菲貓", 3);
System.out.println(加菲貓);
}
}
?獲取類的成員變量
?
public class Demo3 {
@Test
public void testField() throws NoSuchFieldException {
Class<Cat> catClass = Cat.class;
//獲取類的所有公共成員變量(只能獲取public修飾的)
Field[] fields = catClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("===============");
//獲取類的全部成員變量
Field[] declaredFields = catClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName() + declaredField.getType());
}
System.out.println("====================");
Field a = catClass.getField("a");//獲取某個類的成員變量,只要存在就能拿到
System.out.println(a);
Field age = catClass.getDeclaredField("age");
System.out.println(age);
}
@Test
public void test2() throws NoSuchFieldException, IllegalAccessException {
Class clazz = Cat.class;
Cat cat = new Cat();
// System.out.println(cat);
Field age = clazz.getDeclaredField("age");
Field name = clazz.getDeclaredField("name");
//暴力反射
age.setAccessible(true);
name.setAccessible(true);
age.set(cat,5);
name.set(cat,"哈哈");
System.out.println(cat);
//取值
Object o = age.get(cat);
System.out.println(o);
}
}
?獲取類的成員方法
?
?
/*
獲取成員方法[Class提供]
Method[] getMethods() 獲取類的全部公共成員方法(只能獲取public修飾的)
Method[] getDeclaredMethods() 獲取類的全部成員方法(只要存在就能拿到)
Method getMethod(String name, Class<?>... parameterTypes) 獲取類的某個公共成員方法(只能獲取public修飾的)
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 獲取類的某個成員方法(只要存在就能拿到)
使用成員方法(執(zhí)行方法)[Method提供]
public Object invoke(Object obj, Object... args) 觸發(fā)某個對象的該方法執(zhí)行。
public void setAccessible(boolean flag) 設(shè)置為true,表示禁止檢查訪問控制(暴力反射)
注意
使如果想使用private修飾的成員方法,需要暴力反射
*/
public class Demo4 {
@Test
public void testMethods() throws NoSuchMethodException {
Class<Cat> catClass = Cat.class;
Method[] methods = catClass.getMethods();
for (Method method : methods) {
System.out.println("方法名:"+ method.getName() + "返回值類型:" + method.getReturnType());
}
System.out.println("===========================");
Method[] declaredMethods = catClass.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println("方法名:"+ declaredMethod.getName() + "返回值類型" + declaredMethod.getReturnType());
}
System.out.println("===========================");
Method eat = catClass.getDeclaredMethod("eat");
System.out.println("方法名:"+ eat.getName() + "返回值類型" + eat.getReturnType());
System.out.println("===========================");
Method eat1 = catClass.getDeclaredMethod("eat", String.class);
System.out.println("方法名:"+ eat1.getName() + "返回值類型" + eat1.getReturnType());
}
@Test
public void tese2() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<Cat> clazz = Cat.class;
Method eat = clazz.getDeclaredMethod("eat", String.class);
eat.setAccessible(true);
Cat cat = new Cat();
Object invoke = eat.invoke(cat, "??");
System.out.println(invoke);
}
}
案例:?
/*
反射案例
對于任意一個對象,該框架都可以把對象的字段名和對應(yīng)的值,然后打印在控制臺
*/
public class Demo5 {
public static void main(String[] args) {
//1. 準(zhǔn)備兩個對象
Student student = new Student("柳巖", 40, '女', 167.5, "女星");
Teacher teacher = new Teacher("播妞", 6000);
//2.調(diào)用方法
print(student);
}
public static void print(Object o) {
try {
Class clazz = o.getClass();
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
String name = declaredField.getName();
Object o1 = declaredField.get(o);
System.out.println(name+o1);
}
}catch (Exception e){
}
}
}
class Student{
public Student(String name, int age, char sex, double height, String hobby) {
this.name = name;
this.age = age;
this.sex = sex;
this.height = height;
this.hobby = hobby;
}
private String name;
private int age;
private char sex;
private double height;
private String hobby;
}
class Teacher {
public Teacher(String name, double salary) {
this.name = name;
this.salary = salary;
}
private String name;
private double salary;
}
反射的作用?
?
注解
元注解
? ? ? ? ? ? 指的是:修飾注解的注解。?
?注解解析器
? ? ?就是判斷類上、方法上、成員變量上是否存在注解,并把注解里的內(nèi)容給解析出來。?
如何解析注解?
?文章來源:http://www.zghlxwxcb.cn/news/detail-723118.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-723118.html
public class ClassNameCheckParser {
public static void checkClassName(){
//1.存放不符合規(guī)范的類
ArrayList<String> list = new ArrayList<>();
//2.獲取指定包下的所有類
Set<Class> clazzSet = ClassUtil.getClasses("com.itheima.c_annotation.example");
//3.遍歷set集合找到標(biāo)注@ClassNameCheck注解的類'
for (Class clazz : clazzSet) {
//判斷某個類上是否有某個注解
if(clazz.isAnnotationPresent(ClassNameCheck.class)){
//獲得類名
String simpleName = clazz.getSimpleName();
//檢查類名是否以Heima開頭
if(!simpleName.startsWith("Hei")){
list.add(simpleName);
}
}
}
//判斷集合中是否有不符合規(guī)范的,如果有直接保存
if(list.size() > 0) {
System.out.println("下面類名不符合規(guī)范");
for (String name : list) {
System.out.println(name);
}
throw new RuntimeException("程序終止");
}
}
}
到了這里,關(guān)于單元測試&反射&注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!