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

java实现动态代理代码实例(死循环溢出的问题的解决)

2016-12-27 23:39 896 查看
(1)代理对象的接口

package com.csii.proxy;

public interface UserService {

      public void show() ;
}

(2)代理对象类

package com.csii.proxy;

public class UserServiceImpl implements UserService {

    @Override

    public  void show() {

        System.out.println("执行中······");

    }

}

(3)新增功能的接口

package com.csii.proxy;

public interface LoggerService {

    public void before();

    public void after();

}

(4)新增功能实现类

package com.csii.proxy;

public class LoggerServiceImpl implements LoggerService {

    @Override

    public void before() {

        System.out.println("开始执行······");

    }

    @Override

    public void after() {

        System.out.println("执行结束······");

    }

}

(5)MyInvocationHandler类,实现了InvocationHandler接口。

package com.csii.proxy;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    private LoggerService logerService;

    /**

     * 构造方法传入需要代理的对象和需要新增功能的对象

     */

    public MyInvocationHandler(Object target,LoggerService logerService){

        this.logerService=logerService;

        this.target=target;

    }

    @Override

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

            throws Throwable {

        if(logerService!=null){

            logerService.before();

        }

        method.invoke(target, args);//invoke方法中的对象要从外部引入,因为如果传进来使用的话调用invoke方法会陷入死循环。

        if(logerService!=null){

            logerService.after();

        }

        return null;

    }

    /**

     * 获取代理对象

     */

    public Object getProxyObj(){

        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{UserService.class}, this);

    }

}

(6)测试类

package com.csii.userservice;

import org.junit.Test;

import com.csii.proxy.LoggerService;

import com.csii.proxy.LoggerServiceImpl;

import com.csii.proxy.MyInvocationHandler;

import com.csii.proxy.UserService;

import com.csii.proxy.UserServiceImpl;

public class MyProxyTest {

        @Test

        public void testProxy() throws Exception {

            UserService userService =  new UserServiceImpl();

            LoggerService loggerService = new LoggerServiceImpl();

            MyInvocationHandler myInvocationHandler =new MyInvocationHandler(userService,loggerService);

            UserService userProxy = (UserService)myInvocationHandler.getProxyObj();

            userProxy.show();

    }        

}

(7)测试结果截图

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