Java动态代理
作用:Java动态代理思想类似于AOP思想.是指动态生成一个代理去代替真正的对象执行所需要的功能需求.但代理在执行方法的时候
还是会调用真正的对象去执行方法,只不过客户端调用的是一个代理对象.使用Java动态代理主要是为了在执行方法之前横向的插入
相关的功能,例如权限验证,记录日志等.Java动态代理只能代理接口,即所要代理的类必须实现某接口.
Java动态代理的实现: 示例代码
<1>生成接口对象
public interface UserManager {
public void addUser(String username);
public String findUser();
}
<2>功能实现对象,实现UserManager接口
public class UserManagerImpl implements UserManager {
public void addUser(String username){
System.out.println(username);
}
public String findUser(){
return "findUser()"
}
}
<3>代理类(实现InvocationHandler接口)
import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class UserManagerHandler implements InvocationHandler {
//所要代理的目标对象
private Object targetObject;
//生成代理对象(传入目标对象)
public Object createProxy(Object targetObjet){
this.targetObject = targetObject;
//返回代理对象(使用Proxy类的newProxyInstance()方法)
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetobject.getClass().getInterfaces(),
this);
}
//代理生成之后,当所代理的接口去动态调用具体类的每个方法时,都会自动掉用该方法,所以可以在该方法内横向的介入所需要的功能
@Override
/**
* proxy 自动调用进来的被创建好的代理对象
* method 被代理接口的目标方法
* args 调用方法所需要传入的参数
* Object 方法调用之后返回的对象
*/
public Object invoke(Object proxy,Method method,Object... args){
//可以加入相关的方法,进行相应的验证<这就是AOP思想的体现>
//.......
/*
* 调用被传入的目标对象去动态执行具体对象的功能
*/
return method.invoke(targetObject,args);
}
}
<4>客户端
public class Client {
public static void main(String[] args){
//生成代理类对象
UserHandler handler = new UserHandler();
//生成具体对象
UserManagerImpl impl =new UserManagerImpl();
//生成代理对象(只能代理接口对象,传入该接口的实现对象)
UserManager userManager = (UserManager)handler.createProxy(impl);
//利用代理对象去掉用方法(会调用InvocationHandler接口的invoke()方法,及自己所写代理类的invoke()方法)
userManager.addUser(String username);
}
}