package com.hmh;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Base64;
// 测试类
/*
1 Proxy类 :
public static Object newProxyInstance (
ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h ) 获取代理对象的方法
- 返回值:该方法返回就是动态生成的代理对象
- 参数列表说明:
1. ClassLoader loader - 定义代理类的类加载器
2. Class<?>[] interfaces - 代理类要实现的接口列表,要求与被代理类的接口一样。
3. InvocationHandler h - 就是具体实现代理逻辑的接口
2 InvocationHandler接口
public Object invoke(Object proxy, Method method, Object[] args);
1. 返回值:方法被代理后执行的结果。
2. 参数列表:
1. proxy - 就是代理对象
2. method - 代理对象调用的方法
3. args - 代理对象调用方法传入参数值的对象数组.
*/
public class proxy {
public static void main(String[] args) {
// 代理角色是动态生成
// public static Object newProxyInstance ( ClassLoader loader, Class<?>[] interfaces,InvocationHandler h ) : 获取代理对象的方法
// Proxy.newProxyInstance( 代理角色类加载可以写被代理角色的类加载器即可 , 被代理角色实现的所有接口 , 处理器 )
// 创建 被代理角色
BaoQiang baoQiang = new BaoQiang();
// 拿到代理角色的类加载
ClassLoader classLoader = baoQiang.getClass().getClassLoader();
// 被代理角色实现的所有接口
Class<?>[] interfaces = baoQiang.getClass().getInterfaces();
// 创建的是代理角色
Star songZe = (Star) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandlerImpl(baoQiang));
double result = songZe.liveShow(1000);
songZe.sleep();
}
}
// 定义的是处理器的实现类
class InvocationHandlerImpl implements InvocationHandler {
private BaoQiang baoQiang;
public InvocationHandlerImpl(BaoQiang baoQiang) {
this.baoQiang = baoQiang;
}
/*
invoke方法什么时候会执行 ?
代理角色调用方法就会触发invoke执行
proxy : 代理对象
method : 代理角色调用的方法
args : 代理角色调用方法传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
// 对方法进行拦截 , 实现前后增强
if (method.getName().equals("liveShow")) {
// 前增强
System.out.println("宋一宝强拉了一个真人秀活动,获得佣金" + (double) args[0] * 0.8);
// 被代理对象调用方法
result = method.invoke(baoQiang, (double) args[0] * 0.2);
// 后增强
System.out.println("宋一帮宝强把" + result + "存了起来...");
} else if (method.getName().equals("sleep")) {
// 拦截的是sleep
method.invoke(baoQiang);
}
return result;
}
}
// 1 抽象角色
interface Star {
public double liveShow(double money);
public void sleep();
// 1000方法
}
// - 定义被代理角色(宝强)
class BaoQiang implements Star {
@Override
public double liveShow(double money) {
System.out.println("宝强参加了一个真人秀的活动 , 赚了" + money + "钱");
return money;
}
@Override
public void sleep() {
System.out.println("宝强累了, 需要睡觉....");
}
}
动态代理详细代码详解
最新推荐文章于 2024-09-15 19:46:31 发布