动态代理

来源:互联网 发布:洗牌算法 编辑:程序博客网 时间:2024/06/05 10:30

1.Proxy.newProxyInstance(ClassLoader loader, Class< ?>[] interfaces, InvocationHandler h)

参数:
loader - 定义代理类的类加载器
interfaces - 代理类要实现的接口列表
h - 指派方法调用的调用处理程序
返回:
一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口
理解:返回y一个实现接口的代理类 Userdao userdao =new UserdaoImpl();

2.InvocationHandler接口的invoke(Object proxy, Method method, Object[] args)方法

invoke(Object proxy, Method method, Object[] args)在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
参数:
proxy : 在其上调用方法的代理实例
method : 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args : 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
返回值:从代理实例的方法 -调用返回的值

实现动态代理的代码如下:

代理的接口

public interface UserDao {    public abstract void login();    public abstract void regist();}

代理的接口实现

public class UserDaoImpl implements UserDao {    @Override    public void login() {        System.out.println("登录功能");    }    @Override    public void regist() {        System.out.println("注册功能");    }}

关联的调用处理程序

public class MyInvocationHandler implements InvocationHandler {    private Object target;    private MyInvocationHandler() {    }    public MyInvocationHandler(Object target) {        this.target = target;    }    //invoke(Object proxy, Method method, Object[] args)    //在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法    //proxy - 在其上调用方法的代理实例    //method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。    //args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。      //返回值:从代理实例的方法 -调用返回的值    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        System.out.println("调用方法前执行的操作");        //执行实例化target的method方法,方法参数args,方法返回值result        Object result=method.invoke(target, args);        System.out.println("调用方法后执行的操作");        return result;    }

测试:

public class Test {    /**.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)     * loader - 定义代理类的类加载器     *interfaces - 代理类要实现的接口列表     *h - 指派方法调用的调用处理程序      *返回:     *一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口      *     */    public static void main(String[] args) {        UserDao sd=new UserDaoImpl();        MyInvocationHandler h=new MyInvocationHandler(sd);        UserDao sdo=(UserDao)Proxy.newProxyInstance(sd.getClass().getClassLoader(), sd.getClass().getInterfaces(), h);        sdo.login();        sdo.regist();    }}输出:调用方法前执行的操作登录功能调用方法后执行的操作调用方法前执行的操作注册功能调用方法后执行的操作
0 0
原创粉丝点击