动态代理个人理解

动态代理和静态代理角色一样 需要有 真实角色、代理角色、抽象角色

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

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

  1基于接口---JDK动态代理【这里使用】

  2基于类--cglib

  3Java 字节码实现

需要了解两个类, Proxy(代理) ,invocationHandler (调用处理程序)

一、抽象角色

package xl.demo;

/**
 * @author xulei
 * @version 1.0
 * @date 2020/11/15 14:49
 */
public interface Test {
    String bark();
    
    String eat();
}

二、真实角色

package xl.demo;

/**
 * @author xulei
 * @version 1.0
 * @date 2020/11/15 14:56
 */
public class TestImpl implements Test {
    
    @Override
    public String bark() {
        System.out.println("bark");
        return null;
    }
    
    @Override
    public String eat() {
        System.out.println("eat");
        return null;
    }
}

三、代理角色

package xl.demo;

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

/**
* @author xulei
* @version 1.0
* @date 2020/11/15 14:50
*/
public class TestProxy implements InvocationHandler {
Object target;

public TestProxy(Object target) {
this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用之前");
Object invoke = method.invoke(target, args);
System.out.println("调用之后");
return invoke;
}
//获取实例对象
public Object getProxyInstance() {
Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return o;
}
}

四、调用接口

package xl.demo;

import java.lang.reflect.Proxy;

/**
 * @author xulei
 * @version 1.0
 * @date 2020/11/15 14:55
 */
public class Client {
    public static void main(String[] args) {
        //真实角色
        TestImpl test = new TestImpl();
        //代理角色
        TestProxy testProxy = new TestProxy(test);
     //抽象角色,本条语句可以封装到代理角色中 Test o
= (Test) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), testProxy);
    //Test 0 = (Test)testProxy.getProxyInstance(); o.bark(); o.eat(); } }
原文地址:https://www.cnblogs.com/lovetl/p/13976910.html