JDK动态代理
前言
动态代理。
一、动态代理是什么?
动态代理是在程序运行时,让生成的代理对象去干一些非核心的工作;
二、使用步骤
1.抽取当前对象的核心业务代码
代码如下(示例):
由于当前对象里 具体的实现了核心业务代码方法(具体核心业务的实现), 代理对象也有相同的非核心业务代码方法(处理一些杂事),java约定接口的实现类要实现对应的接口;也就是 被代理的对象要实现代理接口;
@Data
public class BigStar implements Star {
private String name;
public BigStar(String name) {
this.name = name;
}
public String sing(String name){
System.out.println(name + "正在唱歌: " + "我是一只小小鸟");
return "唱完了 谢谢 谢谢";
}
public void dance(){
System.out.println("跳舞 跳舞 跳舞 跳舞 跳舞 跳舞");
}
}
2.定义代理对象
代码如下(示例):
public interface Star {
String sing(String name);
void dance();
}
3.生成代理对象
代码如下(示例):
package com.shop.until.DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author ZhangCongHui on 2024/08/17
*/
public class DynamicProxyUtil {
public static Star getProxy(Star star) {
/*
ClassLoader loader, 需要一个类加载器
Class<?>[] interfaces, 数组类型的代理接口
InvocationHandler h 处理方法
*/
Star starProxy = (Star) Proxy.newProxyInstance(
DynamicProxyUtil.class.getClassLoader(),
new Class[]{Star.class},
new InvocationHandler() {
/*
Object proxy, 代理类
Method method, 代理方法
Object[] args 方法的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
if ("sing".equals(methodName)) {
System.out.println("代理人开始工作...准备话筒 收费20万 " + methodName);
}
if ("dance".equals(methodName)) {
System.out.println("代理人开始工作... 准备舞台 收费100万 = " + methodName);
}
//这里是真正的去执行核心业务点的代码
Object invoke = method.invoke(star, args);
return invoke;
}
});
return starProxy;
}
}
总结
测试:
代码如下(示例):
public class TestProxy {
public static void main(String[] args) {
BigStar bigStar = new BigStar("杨超越");
Star starProxy = DynamicProxyUtil.getProxy(bigStar);
String rs = starProxy.sing("好日子");
System.out.println("rs = " + rs);
starProxy.dance();
}
}
运行结果:
代理人开始工作...准备话筒 收费20万 sing
杨超越正在唱 好日子11
rs = 唱完了 谢谢 谢谢
代理人开始工作... 准备舞台 收费100万 = dance
跳舞 跳舞 跳舞 跳舞 跳舞 跳舞
Process finished with exit code 0