#动态代理
动态代理就是在实现类不改变代码的基础上,更改参数和返回的结果
举例:代售电脑
接口
/**
* 动态代理
* 背景:代售电脑,并赚取差价
*/
public interface Computer {
public String sale(double money);
public void show();
}
实现类
public class ComputerImpl implements Computer{
@Override
public String sale(double money) {
return "一台联想电脑只买"+money;
}
@Override
public void show() {
System.out.println("实现类运行了");
}
}
代理实现类的方法
public class ComputerProxy {
public static void main(String[] args) {
ComputerImpl computerProxy = new ComputerImpl();
/**
* 动态代理是不改变原来代码的基础上,
* 改变参数和结果
* 例如,现在客户给了10000,电脑只要7500,传递的参数是10000,但是到实现类中只有7500
*/
//动态创建computerProxy的实现类,有三个参数,分别是被代理类的类加载器,被代理类实现的接口,InvocationHandler的匿名内部类实现动态代理
Computer computer = (Computer) Proxy.newProxyInstance(computerProxy.getClass().getClassLoader(),//第一个参数,对象的类加载器
computerProxy.getClass().getInterfaces(), //获取实现类对象所实现的接口
new InvocationHandler() { //利用InvocationHandler的匿名内部类实现动态代理
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("sale")) {
System.out.println("代理商收了一万");
return method.invoke(computerProxy, args);
}
if (method.getName().equals("show")) {
return method.invoke(computerProxy, args);
}
return null;
}
});
//使用动态代理对象调用接口实现类的方法
String sale = computer.sale(7500d);
System.out.println(sale);
// computer.show();
}
}