A. 需要操作的类
主要内容
1.自定义注解使用案例
A. @Target:描述注解能够作用的位置(使用频率高)
ElementType取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
B. @Retention:描述注解被保留的阶段(使用频率高)
@Retention(RetentionPolicy.RUNTIME):
当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
C. @Documented:描述注解是否被抽取到api文档中
D. @Inherited:描述注解是否被子类继承
1.第一步自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MYzhujie {
String claname();
String demoname();
2.第二步需要操作的类
public class cat {
public void tiao(){
System.out.println("小路在跳");
}
}
3.解析自定义注解
@MYzhujie(claname = "Call.cat", demoname = "tiao")
public class test05 {
public static void main(String[] args) {
MYzhujie zhujie = MYzhujie.class.getAnnotation(MYzhujie.class);
String str = zhujie.claname();
String shet1 = zhujie.demoname();
System.out.println("shet1 = " + shet1);
System.out.println("str = " + str);
}
}
2.Junit单元测试
1.测试的分类
2. 黑盒测试:不需要写代码
3.白盒测试:需要编写代码(Junit单元测试属于白盒)
2.Junit单元测试的步骤
1.定义测试类(包名称: xxx.xxx.test , 类名称: 需要测试名称Test)
2.定义测试方法(可以独立运行,名称:test测试的方法名称,返回值和参数列表空)
3.给方法加注解 @Test
4.添加Junit的依赖
3、判定结果
1.红色: 失败
2.绿色: 成功
3.使用断言操作(预言结果是否正确
3. 断言代码: Assert.assertEquals(期待结果,真实结果);
4.测试方法执行前后注解
1. @Before 在所有测试方法执行前,方法上添加注解(用于数据初始化)
2. @After 在所有测试方法执行后,方法上添加注解(用于释放资源)
5.案例
第一步
public class Cal {
public int add(int a, int b){
return a+b;
}
public int sub(int x, int y){
return x-y;
}
}
第二步
@Before
public void before(){
System.out.println("before...");
}
@Test
public void Add(){
Cal cal =new Cal();
int acc = cal.add(10, 20);
Assert.assertEquals(30,acc);
}
@Test
public void BDD(){
Cal cal =new Cal();
int sub = cal.sub(20, 10);
Assert.assertEquals(-100,sub);
}
@After
public void after(){
System.out.println("after...");
}
}
3.反射案例.成员变量.和私有成员方法
第一步
public class Meizi {
String name="蔡小龙";
int age= 20;
@Override
public String toString() {
return "Meizi{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void claname(){
System.out.println("无参无返回值");
}
public String Mheodname(String a ,String b){
System.out.println("有参有返回值");
return (a)+(b);
}
}
第二步
public class test01 {
public static void main(String[] args) throws Exception {
//类名.class.forname获取文件对象
Class<?> cla = Meizi.class.forName("Call.test.Meizi");
//上面的对象.newInstance获取成员变量
Object o = cla.newInstance();
System.out.println(o);
Field fie = cla.getDeclaredField("name");
//暴力访问fie.setAccessible
fie.setAccessible(true);
//fie.set赋值,或者修改
fie.set(o,"李小龙");
//fie.get就是获取
Object o1 = fie.get(o);
System.out.println("o1 = " + o1);
System.out.println("o = " + o);
}
}