代理模式分为动态代理和静态代理,重点是动态代理
什么叫做代理?
首先要有一个接口,定义了我们的服务(标准)
然后是一个实现类(继承上面那个接口)
还有有一个代理类也会去实现这个那个接口。
然后重点: 代理就是我们不能直接去访问这个实现类,只能通过代理类去访问实现类,先说一下这个访问是通过invoke这个方法实现,参数有 实例对象、方法对象、参数列表。
大概就是下面这个样子 public Object invoke(Object proxy, Method method, Object[] arg2)
如果完全按照上面那个意思来,那就是一个静态代理了。
什么就是动态代理呢,别懵,看我。
其实就是你什么时候来访问 代理类都让你访问并且只有同一个对象代理,这是静态,没有做任何的处理
动态代理就是每次访问实现类的时候每次都派一个对象去访问。所以这里面就有一个调度器proxy
然后动态代理做了预处理、过滤、服务后等操作。也就是说每次调用实例类都不是那么简单,我们需要对调用的对象做处理,就是上面那些处理。
这些处理是一个类做的。InvocationHander();
两个就构成动态代理
代理模式分为动态代理和静态代理,重点是动态代理
什么叫做代理?
首先要有一个接口,定义了我们的服务(标准)
然后是一个实现类(继承上面那个接口)
还有有一个代理类也会去实现这个那个接口。
然后重点: 代理就是我们不能直接去访问这个实现类,只能通过代理类去访问实现类,先说一下这个访问是通过invoke这个方法实现,参数有 实例对象、方法对象、参数列表。
大概就是下面这个样子 public Object invoke(Object proxy, Method method, Object[] arg2)
如果完全按照上面那个意思来,那就是一个静态代理了。
什么就是动态代理呢,别懵,看我。
其实就是你什么时候来访问 代理类都让你访问并且只有同一个对象代理,这是静态,没有做任何的处理
动态代理就是每次访问实现类的时候每次都派一个对象去访问。所以这里面就有一个调度器proxy
然后动态代理做了预处理、过滤、服务后等操作。也就是说每次调用实例类都不是那么简单,我们需要对调用的对象做处理,就是上面那些处理。
这些处理是一个类做的。InvocationHander();
两个就构成动态代理
这里看一下代理
接口:
public interface Person {
/**
* 这里定义一个借口,就是person,里面有一个方法:dosomething
*/
public void dosomething();
}
子类,我们的实现类,真正被调用的方法
/**
* @author JZWen
* 女人实现方法
*/
public class Woman implements Person{
@Override
public void dosomething() {
// TODO Auto-generated method stub
System.out.println("我是女人,我爱美");
}
}
代理类,重点
/**
* @author JZWen
*
*/
public class WomanProxy implements InvocationHandler{
private Person person;
public WomanProxy(Person person) {
// TODO Auto-generated constructor stub
super();
this.person = person;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
donsomethingBefore();
//这不就是反射吗。通过method对象去调用方法。前面是对象,后面是参数
Object ret = method.invoke(proxy, args);
dosomethingAfter();
return ret;
}
public void donsomethingBefore() {
System.out.println("前前前前前前前前前前前前前");
}
public void dosomethingAfter() {
System.out.println("后后后后后后后后后后后后后");
}
/**
* 这就是获取一个代理对象 ,解释一下那个this就是那个实现的InvocationHandler。
* @return
*/
public Object getProxyInstance() {
return Proxy.newProxyInstance(person.getClass().getClassLoader() , person.getClass().getInterfaces() , this);
}
}
测试类:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Woman();
WomanProxy womanProxy = new WomanProxy(person);
//在代理类找到一个人帮忙代理,然后这个代理就像是这个(披着person外套的WomanProxy)
Person person2= (Person)womanProxy.getProxyInstance();
person2.dosomething();
//看到没有 穿进去的person和出来调用dosomething方法的对象不是同一个
}
}
我觉得玄乎的地方在做
getProxyInstance(); 这个方法,他到底做了什么。