2020.05.02 动态代理模式

package com.aojie.Proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* @author aojie
* @fuction
* @create 2020-05-02 20:26
*/
public class ProxyTest {
public static void main(String[] args) {
//创建对象
Lenovo lenovo = new Lenovo();
//动态代理增强方法
/*
三个参数:
1.类加载器:真实对象.getClass.getClassLoader()
2.接口数组:真实对象.getClass().getInterfaces()
3.处理器:new InvocationHandler()
*/
SaleComputer proxyLenovo =(SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
//代理逻辑编写的方法:所有代理对象调用的所有方法都会执行
/*
参数:
1.proxy:代理对象
2.method:代理对象调用的方法被封装为对象
3.args:代理对象执行方法时,传递的实际参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// System.out.println("该方法执行了");
/*
1.增强参数
判断是否有参数的方法

*/
if (method.getName().equals("sale")) {
double money = (double)args[0];
money*=0.85;
System.out.println("专车接");
//使用真实对象调用该方法
String invoke = (String)method.invoke(lenovo, money);
System.out.println("免费送货");
//增强返回值

return invoke+"+鼠标垫";
}else{
Object invoke = method.invoke(lenovo, args);
return invoke;
}

}
});
//调用方法
System.out.println(proxyLenovo.sale(8000));
}
}

猜你喜欢

转载自www.cnblogs.com/aojie/p/12820036.html
今日推荐