动态代理(Spring学习笔记九)

发布于:2024-03-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

1、介绍:

动态代理和静态代理的角色一样

动态代理的代理类是动态生成的,不是我们直接写好的

动态代理分为两大类:基于接口的动态代理    基于类的动态代理

·基于接口   ----  JDK动态代理(我学的是这个)

·基于类   ----  cglib

·Java字节码实现  ---- javassist

2:认识两个类 Proxy:(代理) 和 InvocationHandler:(调用处理程序)

Proxy:

  • Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。

InvocationHandler:

  • InvocationHandler是由代理实例的调用处理程序实现的接口

    每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。

 3、创建一个万用的工具类(用来创建代理角色和注入方法)

package com.li.dedmo01.dedmo2;

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

public class ProxyInvocationHandler implements InvocationHandler {
    //创建被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }
    //生成代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }

    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);
        return result;
    }
}

测试接口和测试类

package com.li.dedmo01;

public interface User {
    public void add();
    public void delete();
    public void update();
    public void query();
}
package com.li.dedmo01;
//原来
public class UserImpl implements User{

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

    @Override
    public void delete() {
        System.out.println("删");
    }

    @Override
    public void update() {
        System.out.println("改");
    }

    @Override
    public void query() {
        System.out.println("查");
    }
}

使用动态代理模式调用方法

package com.li.dedmo01.dedmo2;

public class TestGo {
    public static void main(String[] args) {
        //创建真是角色
        UserImpl ht = new UserImpl();

        //老方式的话这里要创建代理角色,但是这里我们没有代理角色,用前面我们写的工具类来创建代理角色
        ProxyInvocationHandler pih = new ProxyInvocationHandler();

        //设置要代理的类对象
        pih.setTarget(ht);

        //动态生成代理类
        User2 proxy = (User2) pih.getProxy();

        //调用方法
        proxy.add();
    }
}

本文含有隐藏内容,请 开通VIP 后查看