导语
最近在看小傅哥的设计模式时,看到他的抽象工厂中使用了代理,正好这个代理还未接触过,正好学习一下。
正文开始了
啥是代理呢?
对象的执行方法,交给代理来负责
本质还是调用对象的方法,类似于中介。
关键类/接口
- 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();
}
}
- 结尾–广告推广
代理咋个写,瞧这篇