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

来源:互联网 发布:k近邻算法 编辑:程序博客网 时间:2024/06/05 17:22

(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)测试结果截图


0 0
原创粉丝点击