静态代理
1.创建一个Moive接口,编写void play()方法
public interface Moive {
void play();
}
2.创建一个实现类 (play类)
play类实现Moive接口 并输出一句话
public class play implements Moive {
//实现类 实现接口 viod 无返回值
@Override
public void play() {
System.out.println("我要看长城三万里");
}
}
3.编写代理类 (Proxyplay类)
Proxyplay类实现Moive接口 并输入自己需要添加的信息
首先声明传输属性的类型和类型名
(Proxyplay类型实现Moive接口,他的类型指定是那个接口,所以说接口和类型必须是相同)
private Moive moive;
使用构造器构造setter()方法,,无参构造,有参构造
//无参
public Proxyplay() {
}
//有参
public Proxyplay(Moive moive) {
this.moive = moive;
}
//setter方法
public void setMoove(Moive moive) {
this.moive = moive;
}
同时调用被代理类中实现的play()方法
@Override
public void play() {
System.out.println("电影即将开始,我们提前进去吧");
moive.play();//调用被代理类中实现的play()方法
System.out.println("电影结束啦,,我们离开吧");
}
4. 客服端调用
实现类(Play)类实例化
play a = new play();//new一下实现类
代理类(Proxyplay类)实例化
调用接口中的play()方法输出
Proxyplay p = new Proxyplay(a);//new代理类
p.play();//播放电影
5.结果图
动态代理
1.创建租房Person接口,编写void rentHouse()方法
public interface Person {
//租房接口
void rentHouse();
2.实现类 (Renter类) 实现Person接口
输出信息
public class Renter implements Person {
//实现类
@Override
public void rentHouse() {
System.out.println("我要租海景房");
}
3.代理类(Proxyrenter类 )
构造一个类口的代理接口并返回实现类对象
public static Person creatProxyPerson(Renter renter) {
}
生成代理类
(并把代理实现类的java文件加载出来,,和写出继承什么接口,,代理类是实现什么方法)
return (Person) Proxy.newProxyInstance(Proxyrenter.class.getClassLoader(), new Class<?>[]{Person.class}, (p, m, a) -> {
});
代理过程插入其他
输出开始时间 和插入内容
System.out.println("方法:" + m.getName() + "开始时间" + new Date());
System.out.println("租客和中介交流中");
执行方法
Object invoke = m.invoke(renter, a);
租房成功,结束时间并返回方法名
System.out.println("租房成功,请入住");
System.out.println("方法:" + m.getName() + "成功入职时间" + new Date());
return invoke;
代理类整体代码
/*
* Copyright (c) 2020, 2023.
*
*/
package cn;
import java.lang.reflect.Proxy;
import java.util.Date;
/**
* <p>Project: Ch12 - Proxrenter</p>
* <p>Powered by Cyy On 2023-07-29 09:22:02</p>
* <p>描述:<p>
*
* @author Cyy [210585265@qq.com]
* @version 1.0
* @since 17
*/
public class Proxyrenter {
//代理类
public static Person creatProxyPerson(Renter renter) {
return (Person) Proxy.newProxyInstance(Proxyrenter.class.getClassLoader(), new Class<?>[]{Person.class}, (p, m, a) -> {
//代理过程插入其他
//1.输出开始时间
System.out.println("方法:" + m.getName() + "开始时间" + new Date());
System.out.println("租客和中介交流中");
//执行方法
Object invoke = m.invoke(renter, a);
//3. 租房成功,结束时间
System.out.println("租房成功,请入住");
System.out.println("方法:" + m.getName() + "成功入职时间" + new Date());
return invoke;
});
}
}
4.客服端调用
public class Drentrer {
public static void main(String[] args) {
Person p = creatProxyPerson(new Renter());//应该是实例化代理接口
p.rentHouse();
}
}
5.结果图