一、Java代理
代理模式为其他对象提供一种代理(中介)实现对这个对象的访问。大道理上讲代理是一种软件设计模式(场景),其目的是希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。
二、使用步骤
1.引入库
代码如下(示例):
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
2.使用的包和类
如下(示例):
Class
Proxy
ClassLoader
InvocationHandler
import java.lang.reflect
二,获取代理对象代码
package com.icss.biz;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class GetProxy {
private Object object;//被代理对象
public Object getProxyObject(Object object) //获取代理对象的方法,执行invoke
{
this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object o = null;
if(method.isAnnotationPresent(AnnocationUserServer.class))
{
long start =System.currentTimeMillis();
o = method.invoke(object, args);
long end = System.currentTimeMillis()-start;
System.out.println("执行了"+end+"秒");
return o;
}
else
{
o = method.invoke(object, args);
return o;
}
}} );
}
}
四、 UserServer接口(AnnocationUserServer注解)
package com.icss.biz;
public interface UserServer {
@AnnocationUserServer
void login();
void getListUser();
}
五、Main方法
package com.icss.ui;
import com.icss.biz.GetProxy;
import com.icss.biz.UserServer;
import com.icss.biz.UserServerImp;
public class TestServer {
public static void main(String[] args) {
UserServer user = (UserServer) new GetProxy().getProxyObject(new UserServerImp());
user.login();
user.getListUser();
}
}
总结
- 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。是因为所有被代理执行的方法,都是通过在InvocationHandler中的invoke方法调用的,所以我们只要在invoke方法中统一处理,就可以对所有被代理的方法进行相同的操作了。
- 动态代理的过程中,我们并没有实际看到代理类,也没有很清晰地的看到代理类的具体样子,而且动态代理中被代理对象和代理对象InvocationHandler来完成的代理过程的代理对象执行的方法都会通过InvocationHandler中的invoke方法来执行。