动态代理

利用反射实现,AppleStore可以抽象到接口。

代码实现:

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

/**
被代理的对象是一个接口

  • 类的作用是创建一个代理对象
    */
    public class ProxyFactory {
    //描述一个方法 通过Proxy这个类获取一个代理对象
    public static T getStore(Class clazz){
    //通过Proxy类帮我们创建一个对象
    //创建代理对象需要的参数 类加载器
    ClassLoader loader = clazz.getClassLoader();
    //代理的类,Proxy类的方法需要参数是一个Class数组
    Class[] classes = new Class[]{clazz};
    //代理之后的方法
    InvocationHandler handler = new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    iPhone iPhone = new iPhone();
    return iPhone;
    }
    };
    T proxy = (T)Proxy.newProxyInstance(loader,classes,handler);
    //返回Proxy代理类
    return proxy;
    }
    }
  • package dynamicproxy;

public class TestMain {

  1. public static void main(String[] args){<br /> Store store = ProxyFactory._getStore_(AppleStore.class);<br /> iPhone iPhone = store.SelliPhone();<br /> iPhone.call();<br /> iPhone.play();<br /> iPhone.potato();<br /> }<br />}<br />package dynamicproxy;

/**

  • 手机类
  • 可以打电话
  • 可以玩游戏
  • 可以拍照片
  • 手机有尺寸
  • 手机有颜色
    */
    public class iPhone {
    private String color ;
    private String size;
    public void call(){
    System.out.println(“真的iPhone ,打电话方法”);
    }
    public void play(){
    System.out.println(“真的iPhone ,玩游戏方法”);
    }
    public void potato(){
    System.out.println(“真的iPhone ,拍照方法”);
    }
    }
  • package dynamicproxy;

/**

  • 这是一个工厂
  • 可以创造手机
  • 可以出售手机

*/
public interface AppleStore extends Store {
iPhone SelliPhone();
}
package dynamicproxy;

public interface Store {
iPhone SelliPhone();
}