0.代理
代理是基本的设计模式之一,是为了提供额外或者不同的操作,而插入的用来代替“实际”对象的操作,代理通常充斥着中间人的角色。
java中的代码分为静态代理和动态代理。
1.静态代理
代理类在程序运行之前就存在叫静态代理,我们来举个例子。
生命一个接口action。
public interface Action {
void work();
void sleep();
}
实现该接口的实际类
public class RealObjet implements Action {
@Override
public void work() {
System.err.println("realobject work");
}
@Override
public void sleep() {
System.err.println("realobject sleep");
}
}
代理类也需要实现那个接口,并且在静态代理中,需要我们将实际的实现类,传入进去。
public class ProxyObject implements Action {
RealObjet realObjet;
public ProxyObject(RealObjet realObjet){
this.realObjet = realObjet;
}
@Override
public void work() {
realObjet.work();
}
@Override
public void sleep() {
realObjet.sleep();
}
}
最后测试。
RealObjet realObjet = new RealObjet();
ProxyObject proxy = new ProxyObject(realObjet);
proxy.work();
proxy.sleep();
来看下输出结果,这就是一个非常简单的静态代理的例子。
2.动态代理
代理类在运行之前是不存在的,运行过程中由程序动态生成的叫动态代理。实现动态代理的步奏如下。
- 新建委托类(真正的实现类)
- 实现InvocationHandler接口,负责链接代理类和委托类
- 通过Proxy类新建代理类对象
这里的委托类我们还用上面的RealObject。我们看下InvocationHandler接口的实现。
public class RealInvocationHandler implements InvocationHandler {
private Object object;
public RealInvocationHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = (Action) method.invoke(this.object,args);
System.err.println("invoke:"+ method.getName());
return object;
}
}
这里需要注意几个地方。
- 这里所有的地方都需要用Object
好,我们看下最后一步的实现。
RealInvocationHandler invocationHandler = new RealInvocationHandler(new RealObject());
Action action = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(),new Class[]{Action.class},
invocationHandler);
action.work();
action.sleep();
细心的同学会发现,在上面,我们使用的是委托类实现的接口Action,这里一定要注意,构造InvocationHandler的时候,使用委托类,而在其他地方,一定要用委托类的接口,一定要注意。
3. 作用 是什么
从上面我们可以知道,通过代理我们能在方法执行前后做一些操作,好吧,我编不下去了。详情请看。
Java 动态代理作用是什么?