代理咋个写,瞧这篇

导语

最近在看小傅哥的设计模式时,看到他的抽象工厂中使用了代理,正好这个代理还未接触过,正好学习一下。

正文开始了

啥是代理呢?

对象的执行方法,交给代理来负责
本质还是调用对象的方法,类似于中介。

关键类/接口
  • InvocationHandler

InvocationHandler接口是proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法

    /**
    * 该方法代理时执行某个方法会被自行调用
    * proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0
    * method:我们所要调用某个对象真实的方法的Method对象
    * args:指代代理对象方法传递的参数
    */
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
  • Proxy

Proxy类就是用来创建一个代理对象的类,它提供了很多方法,但是我们最常用的是newProxyInstance方法。

如何使用
  • 获取一个代理


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @program: demo
 * @author: zzg
 * @create: 2020-09-29 14:42
 */


public class ProxyUtil {

    /**
     *
     * @Param interfaceClass 某个中介
     * @Param cacheAdapter 某个卖家
     * @author zzg
     * @date 2020/10/12
     * @return T
     * @throws
     */
    public static <T,G> T getProxy(Class<T> interfaceClass,G  cacheAdapter) throws Exception {

        // 获取一个代理执行处理器
        InvocationHandler handler = new JDKInvocationHandler<G>(cacheAdapter);
        //当前线程所运行的类加载器,动态加载jar、资源文件的时候使用
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        //获得interfaceClass所实现的所有接口哦
        Class<?>[] classes = interfaceClass.getInterfaces();
        //创建一个代理对象
        return (T) Proxy.newProxyInstance(classLoader, new Class[]{classes[0]}, handler);
    }
}

  • 实现InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @program: demo
 * @author: zzg
 * @create: 2020-09-30 15:17
 */

class JDKInvocationHandler<T> implements InvocationHandler {

    private T cacheAdapter;

    public JDKInvocationHandler(T cacheAdapter) {
        this.cacheAdapter = cacheAdapter;
    }

    /**
     * proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0
     * method:我们所要调用某个对象真实的方法的Method对象
     * args:指代代理对象方法传递的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       // 查找卖家的同名方法
        Method method1 = cacheAdapter.getClass().getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args));
        //卖家执行
        return method1.invoke(cacheAdapter, args);
    }

}
  • 测试
    • 两个类 加 测试方法

import com.example.demo.proxy.service.ProxyService;
import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: demo
 * @author: zzg
 * @create: 2020-09-30 15:59
 */
@Service("ProxyService")
public class ProxyServiceImpl implements ProxyService {

    @Autowired
    private TestService testService;

    @Override
    public void ceshi(String name, String age) {
        testService.getTaet();
        System.out.println("ProxyServiceImpl===="+name+"====="+age);
    }
}







import com.example.demo.proxy.service.ProxyService;
import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: demo
 * @author: zzg
 * @create: 2020-09-30 16:00
 */

@Service("PService")
public class PServiceImpl implements ProxyService {

    @Autowired
    private TestService testService;
    @Override
    public void ceshi(String name, String age) {
        testService.getTaet();
        System.out.println("PServiceImpl===="+name+"====="+age);
    }
}


   @Test
    void proxyTest() {
        try {
            ProxyService proxy = ProxyUtil.getProxy(ProxyServiceImpl.class,applicationContext.getBean("ProxyService"));
            proxy.ceshi("zzg1","10");
            ProxyService proxy1 = ProxyUtil.getProxy(ProxyServiceImpl.class, applicationContext.getBean("PService"));
            proxy1.ceshi("zzg","10");

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

  • 结尾–广告推广
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值