动态代理
可以理解为一个代工厂
什么品牌都代工 有好多生产线 除了卖苹果手机之外还能卖别的品牌的手机
由于这个对象什么都能做 所以动态代理代理的就不是对象了 而是代理原来对象该做的事情(即方法)
Java已经给我们提供了 Proxy类 可以帮我们创建一个代理对象(这个对象就是动态代理的对象 什么都能做)
动态代理 代理方法(接口/功能)
商店接口:
public interface Store {public iPhone selliPhone();}
苹果商店:
public interface AppleStore extends Store{//苹果的招牌留着 不做事了public iPhone selliPhone();}
iPhone手机:
public class iPhone{private String name;private String color;public iPhone(){}public iPhone(String name,String color){this.name = name;this.color = color;}public String getName() {return name;}public String getColor() {return color;}public void setName(String name) {this.name = name;}public void setColor(String color) {this.color = color;}public void call() {System.out.println("真的iPhone手机 打电话很流畅");}public void play() {System.out.println("真的iPhone手机 玩游戏不卡顿");}public void photo() {System.out.println("真的iPhone手机 拍照片很清晰");}}
代工厂:
public class ProxyFactory {//代工厂//有个方法 通过Proxy这个类获取一个代理对象(代工商店)// 参数----> 代理谁// 返回值---> 代理对象(因为不知道代理谁 所以用泛型来代替)public static <T>T getStore(Class clazz){//创建proxy代理对象前 需要三个参数//0 类加载器---因为传递的是clazz这个类 所以需要把这个类加载进来// 比如把代理的AppleStore这个类加载进来ClassLoader loader = clazz.getClassLoader();//1 代理谁(比如代理苹果店AppleStore 即传递进来的参数clazz)Class[] classes = new Class[]{clazz};//2 代理之后 具体该做什么事情(这里是卖手机)InvocationHandler handler = new InvocationHandler() {//这个invoke方法相当于是代理对象的真正执行方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//proxy就是代理对象//method就是代理对象代替真实对象原来该做的方法//args为代理对象接收到真实对象的参数 相当于执行方法所需参数return null;}};//1 通过Proxy类帮我们创建一个代理对象T proxy = (T) Proxy.newProxyInstance(loader,classes,handler);//2 将proxy代理对象返回return proxy;}}
用户:
public static void main(String[] args){//有一个代工厂 什么品牌都能卖//比如这里代理苹果店Store store = ProxyFactory.getStore(AppleStore.class);iPhone p = store.selliPhone();p.call();p.play();p.photo();//有两个问题//1 如果有一个代工厂做事情 那么真正的AppleStore还需要么?// 可以不需要了 招牌留着 具体不做事//2 如果苹果店不做事 那么是不是应该代工店做事情?}
