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

(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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值