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);
}