一、什么是动态代理?
可以代理很多东西。
举个例子:想买个手机,去(富士康)杂货店购买,杂货店可以卖很多东西。
二、具体代码的实现
手机类:
/**
* 手机
* 手机有属性
* 手机能打电话,拍照,玩游戏
* */
public class Cellphone {
//表示手机
private String name;
private String color;
public Cellphone(){}
public Cellphone(String name,String color){
this.name = name;
this.color = color;
}
//方法
public void call(){
System.out.println("打电话不卡顿");
}
public void photo(){
System.out.println("拍照很清晰");
}
public void play(){
System.out.println("玩游戏不烫手");
}
}
手机工厂类:
/**
* 描述工厂店
* 它可以制造手机、卖手机
* */
public interface CellphoneStore extends Store{
//只存在,不做具体事情
public Cellphone sell();
给工厂制定的规则:
public interface Store {
public Cellphone sell();
}
代理工厂:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {//描述代理工厂,自己写的,描述一个方法,可以生成代理对象
//做事情之前需不需要参数??需要,需要提供一个工厂
//做完事情之后需不需要返回值?需要,需要返回一个工厂
public static <T>T getStore(Class clazz){
//代工厂如何代替原有的工厂做事情?
//分析,需要三个参数
//1.通过反射获取类,但是类加载不进来
ClassLoader loader = clazz.getClassLoader();
//2.代理谁?代理手机工厂
Class[] classes = new Class[]{clazz};
//3.代理手机工厂之后呢?继续生产手机,卖手机
InvocationHandler handler = new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
};
//通过反射,获取具体提供的类
//不确定返回值是什么类型的,用泛型表示
T proxy = (T)Proxy.newProxyInstance(loader,classes,handler);
return proxy;
}
}
测试一下:
package dynamicproxy;
public class TestMain {//描述用户使用
public static void main(String[] args) {
// CellphoneStore store = new CellphoneStore();
// Cellphone p = store.sell();
// p.play();
// p.call();
// p.photo();
Store store = ProxyFactory.getStore(CellphoneStore.class);
Cellphone cellphone = store.sell();
cellphone.photo();
cellphone.call();
cellphone.play();