java 动态代理
前面说过了代理模式(java代理模式),但那只是一个静态代理,在实际使用中作用也确实很大,但是作为一个懒惰的程序员是不能就此满足的。前面我们只有一个Java程序员,明天老板心情好了在招聘一个c程序员,然后公司越来办的越好,我们有了c++程序员,php,python,ruby,c#....然后他们都需要代理类,这样不停加下去是会累死人的。这个时候动态代理就华丽丽的登场啦。
作为老板是不可能给你们公司的每个程序员都配备一个助理的,通常我们只有一个助理,那么这里我们也希望只有一个代理就可以代理所有的程序员。那么这个多功能的助理就是动态代理啦。来看看动态代理的官方解释:我也没看过,自己查吧
直入主题,我们先看看动态代理怎么写的:
public class MyProxy implements InvocationHandler{
private Object subject;
public MyProxy(Object object) {
// TODO Auto-generated constructor stub
this.subject = object;
}
@Override
public Object invoke(Object object, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
method.invoke(subject, args);
return null;
}
}
当然这是一个最简单的写法,我把能省的都省了,具体功能可以定制,但是核心功能method.invoe()不能变,这里是一切的根本,也许这里有人好奇invoke了,没错 invoke , 这里用了java的反射。关于java反射请看这片文章描述(
java反射)。
现在来看看具体怎么用
public void test2() {
Coder javacoder = new JavaCoder();
MyProxy coderProxy = new MyProxy(javacoder);
Coder coder = (Coder) Proxy.newProxyInstance(coderProxy.getClass().getClassLoader(),
javacoder.getClass().getInterfaces(), coderProxy);
coder.coding();
}
运行一下看下结果:
java coder is coding...
啦啦啦 结果出来啦。这我省略了开会与发奖金,大家可以考虑自己怎么实现。
以上就是java的动态代理啦,看看很简单吧。当然java的动态代理绝不是这么简单的应用一下。具体做web开发的都应该知道web开发中使用的著名的spring,spring一大特色就是aop,关于aop的实现就与动态代理有着千丝万缕的联系,还有做过android开发的都知道android中许多service管理就是cs模式实现的,比如android中activity就是由activityManagerService管理的。那么activity是怎么和Service建立关系的呢,这里就用到了代理,只不过这里的代理比不是我们看上去的那么简单就实现的。这个原理以后我们会将到的。。。