一、目的

代理其目的就是为真实对象提供一个代理对象以控制对真实对象的访问。代理类负责为委托类(被代理类、真实类)预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

大致流程

二、代理类

(1)Interface InvocationHandler:该接口中仅定义了一个方法

public Object invoke(Object obj,Method method, Object[] args)
第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。

(2)Proxy:该类即为动态代理类,其中主要包含以下内容:

protected Proxy(InvocationHandler h):

构造函数,用于给内部的h赋值。

static Class getProxyClass (ClassLoaderloader, Class[] interfaces):

获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。

static Object newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h):

返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在RealSubjectInterface接口中声明过的方法)

所谓DynamicProxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个DynamicProxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

在使用动态代理类时,我们必须实现InvocationHandler接口

通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。

三、动态代理创建步骤

1、创建被代理的类(委托类、真实类)(RealSubject)其接口(RealSubjectInterface)

2、创建一个实现接口InvocationHandler的类,它必须实现接口的invoke方法

3、通过Proxy的静态方法newProxyInstance(), 创建一个代理对象(realSubjectProxy),
RealSubjectInterface realSubjectProxy=(RealSubjectInterface) Proxy.newProxyInstance(loader,interfaces,handler);

4、通过代理对象(realSubjectProxy)调用 委托类对象( realSubject)的方法

四、代码展示

1、创建接口

public interface RealSubkectInterface {
public void sayHello(String name);
public void add();
}

2、实现接口

/**
 * @program: untitledDemo
 * @description: 实体类
 * @author: crazy
 * @create: 2020-04-17 10:25
 **/
public class RealSubject implements RealSubkectInterface{
    @Override
    public void sayHello(String name) {
        System.out.println("sayHello"+name);
    }

    @Override
    public void add() {
        System.out.println("add方法");
    }
}

3、实现InvocationHandler接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @program: untitledDemo
 * @description: 实现接口
 * @author: crazy
 * @create: 2020-04-17 10:28
 **/
public class InvocationHandlerImpl implements InvocationHandler {
    Object realSubject;
    InvocationHandlerImpl(Object realSubject)
    {
        this.realSubject = realSubject;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object returnValue = method.invoke(realSubject,args);
        return returnValue;
    }
}

4、通过Proxy创建代理对象

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

/**
 * @program: untitledDemo
 * @description: 测试
 * @author: crazy
 * @create: 2020-04-17 10:34
 **/
public class testdemo {
    public static void main(String[] args) {
        RealSubkectInterface realSubject = new RealSubject();
        InvocationHandler invocationHandler = new InvocationHandlerImpl(realSubject);
        ClassLoader classLoader = realSubject.getClass().getClassLoader();
        Class[] interfaces = realSubject.getClass().getInterfaces();
        RealSubkectInterface realSubkectInterfaceProxy = (RealSubkectInterface) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
        System.out.println("动态代理的对象"+realSubkectInterfaceProxy.getClass().getName());
        realSubkectInterfaceProxy.sayHello("woaini");
    }
}

分类: Java

0 条评论

发表评论

电子邮件地址不会被公开。