java实现JDK动态代理

来源:互联网 发布:农村电子商务淘宝惠 编辑:程序博客网 时间:2024/05/16 18:16

1:创建一个接口HelloWorld

package dynamicproxy;public interface HelloWorld {  //首先定义一个接口,产生代理对象。真实对象为实现类。        void sayHello();        void sayHelloString(String s);}

2:创建实现了代理对象(接口)的真实对象SayHelloWorld ,ImpHelloWorld

package dynamicproxy;public class SayHelloWorld implements HelloWorld {  //实现了代理对象的真实对象。    public void sayHello() {        // TODO Auto-generated method stub        System.out.println("Hello World");    }    public void sayHelloString(String s){        System.out.println(s+"Hello World");    }}package dynamicproxy;public class ImpHelloWorld implements HelloWorld{    public void sayHello() {        // TODO Auto-generated method stub        System.out.println("imp Hello World");    }    public void sayHelloString(String s) {        // TODO Auto-generated method stub        System.out.println(s+"imp Hello World");    }}

3:建立代理对象和真实对象之间的绑定关系和逻辑方法 JDKDynamicProxy implements InvocationHandler

package dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 代理逻辑类必须实现  InvocationHandler * @author admin * @version 1.0 * */public class JDKDynamicProxy implements InvocationHandler {    Object target=null;    /**     * 建立代理对象和真实对象的代理关系,并返回代理对象     * @param target真实对象     * @return 返回代理对象     */    public Object bind(Object target) {  //动态代理绑定        // TODO Auto-generated method stub        this.target=target;        return Proxy.newProxyInstance(target.getClass().getClassLoader(),                 target.getClass().getInterfaces(), this);    }    /**     * 代理方法逻辑     * @param proxy代理对象     * @param method 当前调度方法     * @param args 当前方法参数     * @return 代理结果返回     * @throws Throwable 异常     */    public Object invoke(Object proxy, Method method, Object[] args) //代理逻辑实现            throws Throwable {        System.out.println("进入代理逻辑方法");        System.out.println("在调度真实对象之前的服务");        Object obj=method.invoke(target, args);  //相当于调用sayHello,调用真实对象                                                //target.invoke;相当于真实对象调用方法        System.out.println("在调度真实对象之后的服务");            return obj;    }}

4:主函数调用

package dynamicproxy;public class DynamicProxy {    /**     * 动态代理:     * 1,定义一个接口,作为代理对象     * 2,创建真实对象(可以有多个),实现代理对象。里面有真实对象要做的事情(方法)     * 3,创建实现了InvocationHandler的对象,该对象进行了动态代理绑定,和代理逻辑实现,     *   逻辑实现里面在真实对象方法前后可以加入代理对象自己的逻辑。     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        JDKDynamicProxy jdk=new JDKDynamicProxy();  //创建实现了InvocationHandler的对象。                                           //该对象进行了动态代理绑定,和代理逻辑实现        //绑定关系,因为挂在接口HelloWorld下,所以声明对象HelloWorld proxy,        HelloWorld proxy=(HelloWorld)jdk.bind(new SayHelloWorld());   //HelloWorld代理了其实现类SayHelloWorld        //此时HelloWorld对象已经是一个代理对象,它会进入代理逻辑方法invoke里        HelloWorld proxy1=(HelloWorld) jdk.bind(new ImpHelloWorld());        proxy.sayHello();  //当前调度方法,调用整个invoke方法,里面也含有代理对象自己的逻辑。        proxy.sayHelloString("String");        proxy1.sayHello();//会进入代理逻辑invoke里,把这个方法调用放在Object obj=method.invoke(target, args);                          //相当于真实对象调用sayHello()。但是前后加上了动态代理的逻辑。                          //obj说明有些函数可能会有返回值        proxy1.sayHelloString("String");    }}

5:输出结果:
进入代理逻辑方法
在调度真实对象之前的服务
imp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
Stringimp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
imp Hello World
在调度真实对象之后的服务
进入代理逻辑方法
在调度真实对象之前的服务
Stringimp Hello World
在调度真实对象之后的服务

6:结构图:这里写图片描述

原创粉丝点击