动态代理
特点:
字节码随用随创建,随用随加载。 它与静态代理的区别也在于此。因为静态代理是字节码一上来就创建好,并完成加载。 装饰者模式就是静态代理的一种体现。
基于接口的动态代理
提供者:JDK 官方的 Proxy 类。
要求:被代理类最少实现一个接口。
案例
我们在购买电脑时一般是在当地电脑经销商购买,而经销商的电脑是从生产商进货而来的,经销商通过差价来盈利,比如一台电脑从厂家以4000元买进,6000元卖出。
在这个案例中,经销商就是代理对象,厂家就是被代理对象。
代码演示
IProxy接口
public interface IProxy {
/**
* 销售电脑
* @param money 电脑价格
*/
void salecomputer(float money);
/**
* 维修电脑
*/
void repair_computer();
}
ProxyImpl实现类
public class ProxyImpl implements IProxy {
@Override
public void salecomputer(float money) {
System.out.println("销售电脑,获得了"+money+"元钱");
}
@Override
public void repair_computer()
{
System.out.println("电脑维修成功!");
}
}
测试代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Testdemo {
public static void main(String[] args) {
final ProxyImpl proxyimpl = new ProxyImpl();
/**
* 代理:
* 获取代理对象:
* 要求:
* 被代理类最少实现一个接口
* 创建的方式:
* Proxy.newProxyInstance(三个参数)
* 参数含义:
* ClassLoader:和被代理对象使用相同的类加载器。
* Interfaces:和被代理对象具有相同的行为。实现相同的接口。
* InvocationHandler:如何代理。
* */
IProxy proxyInstance = (IProxy)Proxy.newProxyInstance(proxyimpl.getClass().getClassLoader(), proxyimpl.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnvalue = null;
if ("salecomputer".equals(method.getName())) {
Float money = (Float) args[0];
returnvalue = method.invoke(proxyimpl, money * 3/2);
}
return returnvalue;
}
});
proxyInstance.salecomputer(4000f);
}
}
执行结果如下:
销售电脑,获得了6000.0元钱
Process finished with exit code 0
以上就是今天分享的关于动态代理的内容了,希望大家能够有所收获,欢迎关注。