您的位置:首页 > 编程语言 > Java开发

Java动态代理一------动态类Proxy的使用

2014-04-06 11:37 489 查看
目前Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。 其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 

Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现

1.定义一个接口:

package com.lvyuanj.test;

 /**

 * 定义一个HelloWorld接口

 *

 * @author lvyuanj

 *

 */

 public interface HelloWorld {

    public void sayHelloWorld();

}

2.类HelloWorldImpl是HelloWorld接口的实现

package com.lvyuanj.test;

 /**

 * 类HelloWorldImpl是HelloWorld接口的实现

 *

 * @author lvyuanj

 *

 */

 public class HelloWorldImpl implements HelloWorld{

    public void sayHelloWorld() {

        System.out.println("HelloWorld!");

    }

}

3.HelloWorldHandler是 InvocationHandler接口实现

package com.lvyuanj.test;

 import java.lang.reflect.InvocationHandler;

 import java.lang.reflect.Method;

 /**

 * 实现在方法调用前后向控制台输出两句字符串

 *

 * @author lvyuanj

 *

 */

 public class HelloWorldHandler implements InvocationHandler{

    //要代理的原始对象

     private Object obj;

    

    public HelloWorldHandler(Object obj) {

        super();

        this.obj = obj;

    }

    /**

     * 在代理实例上处理方法调用并返回结果

     *

     * @param proxy 代理类

     * @param method 被代理的方法

     * @param args 该方法的参数数组

     */

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = null;

        //调用之前

         doBefore();

        //调用原始对象的方法

        result=method.invoke(obj, args);

        //调用之后

        doAfter();

        return result;

    }

    

    private void doBefore(){

        System.out.println("before method invoke");

    }

    

    private void doAfter(){

        System.out.println("after method invoke");

    }

    

}

4.测试类

package com.lvyuanj.test;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class HelloWorldTest {

    public static void main(String[] args) {

        HelloWorld helloWorld=new HelloWorldImpl();

        InvocationHandler handler=new HelloWorldHandler(helloWorld);

        

        //创建动态代理对象

        HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(

                helloWorld.getClass().getClassLoader(),

                helloWorld.getClass().getInterfaces(),

                handler);

        proxy.sayHelloWorld();

    }

}

运行结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 动态代理 proxy