代理
388字约1分钟
2025-11-21
代理类就是在不改变源程序的情况下添加一些功能
实现接口
public interface Star {
public abstract String sing(String name);
public abstract void dance();
}原程序
public class BigStar implements Star {
private String name;
public BigStar() {}
public BigStar(String name) {
this.name = name;
}
@Override
public String sing(String name) {
System.out.println(this.name + " 正在唱" + name);
return "谢谢";
}
@Override
public void dance() {
System.out.println(this.name + " 正在跳舞");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}代理类
public class PoU {
// 代理
public static Star create(BigStar bigStar) {
Star star = (Star) Proxy.newProxyInstance(
// 指定类加载器,用于加载生成的代理类
PoU.class.getClassLoader(),
// 指定接口,指定代理类需要实现的接口数组
new Class[]{Star.class},
// 指定代理生成的代理对象要干什么
new InvocationHandler() {
/*
* proxy:生成的代理对象本身
* method:当前被调用的方法对象
* args:当前方法的参数列表
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 添加的内容
if ("sing".equals(method.getName())) {
System.out.println("准备话筒");
} else if ("dance".equals(method.getName())) {
System.out.println("准备场地");
}
return method.invoke(bigStar, args);
}
}
);
return star;
}
}调用代理类
public static void main(String[] args) {
BigStar bigStar = new BigStar("坤哥");
Star pou = PoU.create(bigStar);
// sing 传到method中
// 实参的内容 传到args数组中
// 输出: 准备话筒(添加的内容)
// 坤哥 正在唱姬霓太美(原程序的内容)
String sing = pou.sing("姬霓太美"); // 相当于调用bigStar类中的sing方法
System.out.println(sing); // 谢谢(源程序返回的内容)
// 输出: 准备场地(添加的内容)
// 坤哥 正在跳舞(原程序的内容)
pou.dance();
}