实验四: 目 的:理解掌握AOP的五个专业术语、四个通知类型及一种静态代理技术和两种动态代理技术。 实验内容:假设学生为核心类,学生做的事情是代理类。学生需要做的核心业务有:课堂学习(study)、做家庭作业(homeWork);需要做的非核心业务为:准备上课(打开书本、预习),听老师讲课(做笔记、完成课堂练习),上课结束(收拾书包、带走垃圾);准备做家庭作业(复习今天课堂所学知识),开始做家庭作业(打开作业本、写作业、检查改错、预习),完成家庭作业(收拾书本)。 根据上面描述场景,分别通过静态代理、动态代理两种技术完成代码编写及测试。
时间: 2023-06-13 16:02:22 浏览: 253
静态代理实现:
1. 学生接口定义
```java
public interface Student {
void study();
void homeWork();
}
```
2. 学生核心实现
```java
public class PrimaryStudent implements Student {
@Override
public void study() {
System.out.println("学生正在上课学习...");
}
@Override
public void homeWork() {
System.out.println("学生正在做家庭作业...");
}
}
```
3. 学生代理实现
```java
public class StudentProxy implements Student {
private Student student;
public StudentProxy(Student student) {
this.student = student;
}
@Override
public void study() {
System.out.println("学生准备上课...");
student.study();
System.out.println("学生听老师讲课,做笔记,完成课堂练习...");
System.out.println("学生上课结束,收拾书包,带走垃圾...");
}
@Override
public void homeWork() {
System.out.println("学生准备做家庭作业,复习今天课堂所学知识...");
System.out.println("学生开始做家庭作业,打开作业本,写作业,检查改错,预习...");
student.homeWork();
System.out.println("学生完成家庭作业,收拾书本...");
}
}
```
4. 测试
```java
public class TestStaticProxy {
public static void main(String[] args) {
Student primaryStudent = new PrimaryStudent();
Student proxy = new StudentProxy(primaryStudent);
proxy.study();
System.out.println("-------------");
proxy.homeWork();
}
}
```
输出结果:
```
学生准备上课...
学生正在上课学习...
学生听老师讲课,做笔记,完成课堂练习...
学生上课结束,收拾书包,带走垃圾...
-------------
学生准备做家庭作业,复习今天课堂所学知识...
学生开始做家庭作业,打开作业本,写作业,检查改错,预习...
学生正在做家庭作业...
学生完成家庭作业,收拾书本...
```
动态代理实现:
1. 学生接口定义
```java
public interface Student {
void study();
void homeWork();
}
```
2. 学生核心实现
```java
public class PrimaryStudent implements Student {
@Override
public void study() {
System.out.println("学生正在上课学习...");
}
@Override
public void homeWork() {
System.out.println("学生正在做家庭作业...");
}
}
```
3. 动态代理实现
```java
public class StudentDynamicProxy implements InvocationHandler {
private Object target;
public StudentDynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("学生准备上课...");
Object result = method.invoke(target, args);
System.out.println("学生听老师讲课,做笔记,完成课堂练习...");
System.out.println("学生上课结束,收拾书包,带走垃圾...");
return result;
}
public static Object createProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new StudentDynamicProxy(target)
);
}
}
```
4. 测试
```java
public class TestDynamicProxy {
public static void main(String[] args) {
Student primaryStudent = new PrimaryStudent();
Student proxy = (Student) StudentDynamicProxy.createProxy(primaryStudent);
proxy.study();
System.out.println("-------------");
proxy.homeWork();
}
}
```
输出结果:
```
学生准备上课...
学生正在上课学习...
学生听老师讲课,做笔记,完成课堂练习...
学生上课结束,收拾书包,带走垃圾...
-------------
学生准备做家庭作业,复习今天课堂所学知识...
学生开始做家庭作业,打开作业本,写作业,检查改错,预习...
学生正在做家庭作业...
学生完成家庭作业,收拾书本...
```
阅读全文