动态代理2

Spring框架 调用目标方法时会执行@before
有一个方法
{
@before
执行目标方法
}
方法来自动态类
创建动态类需要类加载器,方法信息
通过动态代理对象调用目标方法,会执行invocationHandler.invoke()

dubbo微服务框架(代码放在另外一台服务器上运行)
invoke(){
把接口名,方法名,参数,参数类型发给服务器
}

1.得到动态代理对象
2.通过动态代理对象调用目标方法
3.调用了目标方法,java虚拟机会执行invoke()

package com.jt.controller;

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

import com.jt.service.CartService;

public class CartController {

    public static void main(String[] args) {
        //1.得到动态代理对象
        Object proxyObject=getProxyObject(CartService.class);
        //2.通过动态代理对象调用目标方法
        CartService cartService=(CartService) proxyObject;
        cartService.findCartById(11L);
        //3.调用了目标方法,java虚拟机会执行invoke()
    }
    static class MyInvocationHandler implements
    InvocationHandler{
        String interfaceName;
        public MyInvocationHandler(String interfaceName) {
            this.interfaceName = interfaceName;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println(method.getName());
            System.out.println(Arrays.toString(args));
            return null;
        }
    }
    static Object getProxyObject(Class intefraceInfo){
        //创建动态类需要类加载器和方法信息
        ClassLoader classLoader=intefraceInfo.getClassLoader();
        Class[] methodInfo={intefraceInfo};
        //通过动态代理对象执行目标方法时,系统自动调用invoke
        MyInvocationHandler myinvocationHandler=new MyInvocationHandler(intefraceInfo.getName());
        return Proxy.newProxyInstance(classLoader, methodInfo, myinvocationHandler);
    }
}
package com.jt.service;

public interface CartService {
     String findCartById(Long id);
}

动态代理2_第1张图片
动态代理

你可能感兴趣的:(动态代理2)