代理模式
定义
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
解决什么问题
静态代理
动态代理
在程序运行期间根据需要动态创建代理类及其实例来完成具体的功能。
JDK动态代理
关键代码示例
- package com.jd.designpattern.proxy;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
-
- /**
- * 代理Handler
- */
- public class ProxyHandler implements InvocationHandler {
-
- private Object object;
-
- public ProxyHandler(Object object){
- this.object = object;
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("动态代理 - 执行前:" + method.getName());
- method.invoke(object, args);
- System.out.println("动态代理 - 执行后:" + method.getName());
- return null;
- }
- }
其中的wirte()方法是将生成的代理类写入到本地,用idea打开后可查询生成的class到底是什么
- package com.jd.test.proxy;
-
- import com.jd.designpattern.proxy.ProxyHandler;
- import com.jd.designpattern.proxy.ProxySubject;
- import com.jd.designpattern.proxy.RealSubject;
- import com.jd.designpattern.proxy.Subject;
- import org.junit.Test;
- import sun.misc.ProxyGenerator;
-
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
-
- /**
- * 代理模式测试类
- * @author jubingtao
- * @date 2020-4-27
- */
- public class ProxyTest {
-
- @Test
- public void testStaticProxy(){
- //获取代理
- Subject subject = new ProxySubject();
- subject.request();
- }
-
- @Test
- public void testDynamicProxy(){
- Subject subject = new RealSubject();
- InvocationHandler handler = new ProxyHandler(subject);
- Subject proxySubject = (Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), handler);
- proxySubject.request();
- write();
- }
-
- private void write(){
- String path = "D:/$Proxy0.class";
- byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy0",RealSubject.class.getInterfaces());
- FileOutputStream out = null;
- try {
- out = new FileOutputStream(path);
- out.write(classFile);
- out.flush();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {