JDK动态代理

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值