本帖最后由 小石姐姐 于 2019-5-23 16:47 编辑
课堂知识点
一、反射
1.基本概念
- 在程序运行过程中,动态的获取一个类的成员(成员变量、构造方法、成员方法)并使用
- 作用:反射被称为框架技术的灵魂
2.获取Class对象三种方式
- 类名.class
- 对象名.getClass()
- Class.forName(全类名)
3.程序的执行经历流程
4.反射案例
- 老师类
[AppleScript] 纯文本查看 复制代码 public class Teacher {
public void teach() {
System.out.println("老师讲课");
}
}
- 学生类
[AppleScript] 纯文本查看 复制代码 public class Student {
public void study() {
System.out.println("学生学习");
}
}
- 测试类
/*
框架功能:
不改动当前类中的代码,还能去创建不同类的对象,调用不同的方法
[AppleScript] 纯文本查看 复制代码 */
public class Test02 {
public static void main(String[] args) throws Exception{
/*Student stu = new Student();
stu.study();
Teacher t = new Teacher();
t.teach();*/
Properties prop = new Properties();
InputStream is = Test02.class.getClassLoader().getResourceAsStream("test.properties");
prop.load(is);
String className = prop.getProperty("className");
String methodName = prop.getProperty("methodName");
//通过反射技术,来使用老师类中的teach方法
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method method = cls.getMethod(methodName);
method.invoke(obj);
}
}
- 配置文件
#className=com.itheima01.Student
#methodName=study
className=com.itheima01.Teacher
methodName=teach
二、Junit
1.测试分类
- 黑盒测试:傻瓜式测试。只关心结果!
- 白盒测试:更有技术含量。除了关心结果,还要关心程序的安全性和健壮性
2.Junit基本使用
- 在方法声明上,加上@Test注解
- 示例代码
[AppleScript] 纯文本查看 复制代码 public class Calculator {
/**
* 加法
* @param a
* @param b
* @return
*/
public int add (int a , int b){
//int i = 3/0;
return a - b;
}
/**
* 减法
* @param a
* @param b
* @return
*/
public int sub (int a , int b){
return a - b;
}
}
public class CalculatorTest {
/**
* 初始化方法:
* 用于资源申请,所有测试方法在执行之前都会先执行该方法
*/
@Before
public void init(){
System.out.println("init...");
}
/**
* 释放资源方法:
* 在所有测试方法执行完后,都会自动执行该方法
*/
@After
public void close(){
System.out.println("close...");
}
/**
* 测试add方法
*/
@Test
public void testAdd(){
//1.创建计算器对象
System.out.println("testAdd...");
Calculator c = new Calculator();
//2.调用add方法
int result = c.add(1, 2);
//3.断言 我断言这个结果是3
Assert.assertEquals(3,result);
}
@Test
public void testSub(){
//1.创建计算器对象
Calculator c = new Calculator();
int result = c.sub(1, 2);
System.out.println("testSub....");
Assert.assertEquals(-1,result);
}
}
3.单元测试需要使用的注解
- @Before 执行功能方法之前被执行
- @Test 执行功能方法
- @After 执行功能方法之后被执行
三、注解
1.注解概念
- 注解就是用于说明程序的。参与程序的运行
- JDK1.5版本之后的新特性
2.注解的作用
- 编写文档(API帮助文档)
- 编译检查(@Override @FunctionalInterface)
- 代码分析(配合反射使用)【重点】
3.常用的注解
- @Override 用于检测方法是否是重写的
- @Deprecated 用于标识某个方法是否已过时
- @SuppressWarnings 用于压制警告
- @FunctionalInterface 用于检测接口是否是一个函数式接口
- @Before 在功能方法之前被执行
- @Test 执行功能方法
- @After 在功能方法之后被执行
4.自定义注解
- 格式
public @interface 注解名称{
}
- 本质
- 注解本质就是一个接口!所有的注解都实现了Annotation接口
- 注解中的属性
- 属性(方法)的返回值数据类型
- 基本数据类型四类八种
- String
- 枚举
- 注解
- 以上数据类型的数组
- 注意事项
- 可以使用default给属性设置一个默认初始化值
- 如果属性名叫value,而且只有一个属性时,那么赋值时,属性名可以省略
- 数组进行赋值时,需要使用{}。如果数组中只有一个值,{}可以省略
- 元注解
- @Target(ElementType)
- TYPE 用于类上面
- METHOD 用于方法上面
- FIELD 用于变量上面
- @Retention(RetentionPolicy)
- SOURCE 源代码阶段
- CLASS 字节码阶段
- RUNTIME 运行时阶段
- @Documented 可以被抽取到帮助文档中
- @Inherited 可以被子类继承
5.解析注解
- 狗类
[AppleScript] 纯文本查看 复制代码 public class Dog {
public void eat() {
System.out.println("狗吃肉");
}
}
- 猫类
[AppleScript] 纯文本查看 复制代码 public class Cat {
public void eat() {
System.out.println("猫吃鱼");
}
}
- 注解
[AppleScript] 纯文本查看 复制代码 @Target(value = {ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface AnimalAnnotation {
String className(); // 记录 全类名
String methodName(); // 记录 方法名
}
- 测试类
[AppleScript] 纯文本查看 复制代码 @AnimalAnnotation(className = "com.itheima01.Cat",methodName = "eat")
public class Test06 {
public static void main(String[] args) throws Exception{
//获取注解中的属性值
//1.获取Test06类的Class对象
Class<Test06> cls = Test06.class;
//2.通过Class对象来获取注解对象
AnimalAnnotation animal = cls.getAnnotation(AnimalAnnotation.class);
//3.通过注解对象调用属性。来获取属性值
String className = animal.className();
String methodName = animal.methodName();
//通过反射来调用方法
//1.获取Class对象
Class cls2 = Class.forName(className);
//2.获取方法
Method method = cls2.getMethod(methodName);
//3.执行方法
method.invoke(cls2.newInstance());
}
}
|