学习动态代理原理是为以后理解框架而必须的
需要注意的点:

接口:java.lang.reflect.InvocationHandler

方法:java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

重写方法:invoke

以下是有接口的情况,使用JDK代理(没有接口的情况使用CGLIB动态代理)

package com.du.proxy;

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

// ①==================基于Java接口实现动态代理==========================
class Proxyer implements InvocationHandler{

    // 被代理对象
    private Object o;

    // 确定被代理对象
    public Proxyer(Object o) {
        this.o = o;
    }

    /**
     * 类加载器
     * 得到被代理对象的接口
     * 代理对象实体类
     * @return
     */
    // 确定代理对象的实例
    public Object bind(){
        return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理之前执行的辅助方法!");
        Object result=method.invoke(o, args);
        System.out.println("代理之后执行的辅助方法!");
        return result;
    }

}

// ②==================被代理的业务==========================
interface Service{
    void doService();
}
// ③===================被代理对象=========================
class Obj implements Service{

    @Override
    public void doService() {
        System.out.println("主要执行的核心业务");
    }
}
// ④===================测试执行=========================
public class MainTest{
    public static void main(String[] args) {
        Obj obj = new Obj();
        Proxyer proxyer = new Proxyer(obj);
        Service b = (Service) proxyer.bind();
        b.doService();
    }
}
代理之前执行的辅助方法!
主要执行的核心业务
代理之后执行的辅助方法!