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

}
输出:
调用方法前执行的操作
登录功能
调用方法后执行的操作
调用方法前执行的操作
注册功能
调用方法后执行的操作
posted on 2017-04-08 00:56  2637282556  阅读(118)  评论(0编辑  收藏  举报