一、概述
二、Jdk动态代理案例
2.1、Star
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/10/27 17:16
* @Description:
*/
public interface Star {
/**
* 唱歌
* @param name 歌曲名字
* @return
*/
String sing(String name);
/**
* 跳舞
*/
void dance();
}
2.2、BigStar
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/10/27 17:12
* @Description: 大明星类(目标对象)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BigStar implements Star {
/**
* 明星的名字
*/
private String name;
/**
* 唱歌
* @param name 歌曲名字
* @return
*/
@Override
public String sing(String name) {
System.out.println(this.name + "正在唱:" + name);
return "谢谢!谢谢!";
}
/**
* 跳舞
*/
@Override
public void dance() {
System.out.println(this.name + "正在优美的跳舞");
}
}
2.3、BigStarProxy
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/10/27 17:18
* @Description: 经纪人
*/
public class BigStarProxy {
public static Star createProxy(BigStar bigStar) {
/**
* 参数1:类加载器
* 参数2:指定生成的代理长什么样,也就是有哪些方法
* 参数3:用来指定生成的代理对象要干什么事情
*/
ClassLoader classLoader = BigStarProxy.class.getClassLoader();
Class<?>[] interfaces = bigStar.getClass().getInterfaces();
Star starProxy = (Star) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 代理对象要做的事情,会在这里写代码
if ("sing".equals(method.getName())) {
System.out.println("准备话筒,收钱20万");
} else if ("dance".equals(method.getName())) {
System.out.println("准备场地,收钱1000万");
}
return method.invoke(bigStar,args);
}
});
return starProxy;
}
}
2.4、测试
/**
* @Author : 一叶浮萍归大海
* @Date: 2023/10/27 17:33
* @Description:
*/
public class SpringProxyJdkMain {
public static void main(String[] args) throws Exception {
m1();
}
private static void m1() {
BigStar bigStar = new BigStar("杨超越");
Star proxy = BigStarProxy.createProxy(bigStar);
String singResult = proxy.sing("好日子");
System.out.println(singResult);
System.out.println("=================");
proxy.dance();
}
}