十三, 动态代理
-
特点: 无侵入式的给对象增加额外的功能

-
代理里面就是对象要被代理的方法
-
Java通过什么来保证代理的样子?
通过接口保证, 后面的对象和代理需要实现同一个接口
接口中就是被代理的所有方法

创建代理流程
1. 创建对象
package awei.itheima.DynamicProxy;
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 "谢谢";
}
// 跳舞
public void dance() {
System.out.println(this.name + "正在跳舞");
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
public String toString() {
return "BigStar{name = " + name + "}";
}
}
2. 创建接口(里面是含有需要代理实现的方法)
package awei.itheima.DynamicProxy;
public interface Star {
// 写想要被代理的方法
public abstract String sing(String name);
public abstract void dance();
}
3. 为Java对象创建一个代理对象

package awei.itheima.DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
*类的作用: 创建一个代理
*需求: 外面的人想要大明星唱一首歌
*步骤:(1) 获取代理的对象 代理对象 = ProxyUtil.createProxy(大明星的对象);
*(2) 调用代理对象的唱歌方法: 代理对象.唱歌方法("只因你太美");
**/
public class ProxyUtil {
/*
方法的作用: 给一个明星的对象, 创建一个代理
形参: 被代理的明星对象
返回值: 创建的代理对象(可以写接口的类型)
*/
public static Star createProxy(BigStar bigstar){
/* java.lang.reflect.Proxy类: 提供了为对象产生代理对象的方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
*/
Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), // 参数一: 用于指定哪个类加载器, 去加载生成的代理类
new Class[]{Star.class}, // 参数二: 创建代理对象时, 指定代理对象要实现的接口, 也就是所有方法(是一个数组)
new InvocationHandler() {
// 参数三: 用来指定生成的代理对象要干什么事情
@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;
}
}
4. 运行测试
package awei.itheima.DynamicProxy;
public class Test {
public static void main(String[] args) {
/**
*类的作用: 创建一个代理
*需求: 外面的人想要大明星唱一首歌
*步骤:(1) 获取代理的对象 代理对象 = ProxyUtil.createProxy(大明星的对象);
*(2) 调用代理对象的唱歌方法: 代理对象.唱歌方法("只因你太美");
**/
BigStar bigstar = new BigStar("周杰伦");
Star proxy = ProxyUtil.createProxy(bigstar);
String res = proxy.sing("冰雨");
System.out.println(res);
}
}
image.png

浙公网安备 33010602011771号