Spring框架 調(diào)用目標(biāo)方法時(shí)會(huì)執(zhí)行@before
有一個(gè)方法
{
@before
執(zhí)行目標(biāo)方法
}
方法來(lái)自動(dòng)態(tài)類(lèi)
創(chuàng)建動(dòng)態(tài)類(lèi)需要類(lèi)加載器即碗,方法信息
通過(guò)動(dòng)態(tài)代理對(duì)象調(diào)用目標(biāo)方法,會(huì)執(zhí)行invocationHandler.invoke()
dubbo微服務(wù)框架(代碼放在另外一臺(tái)服務(wù)器上運(yùn)行)
invoke(){
把接口名,方法名鸵膏,參數(shù)馏颂,參數(shù)類(lèi)型發(fā)給服務(wù)器
}
1.得到動(dòng)態(tài)代理對(duì)象
2.通過(guò)動(dòng)態(tài)代理對(duì)象調(diào)用目標(biāo)方法
3.調(diào)用了目標(biāo)方法,java虛擬機(jī)會(huì)執(zhí)行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.得到動(dòng)態(tài)代理對(duì)象
Object proxyObject=getProxyObject(CartService.class);
//2.通過(guò)動(dòng)態(tài)代理對(duì)象調(diào)用目標(biāo)方法
CartService cartService=(CartService) proxyObject;
cartService.findCartById(11L);
//3.調(diào)用了目標(biāo)方法氧卧,java虛擬機(jī)會(huì)執(zhí)行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){
//創(chuàng)建動(dòng)態(tài)類(lèi)需要類(lèi)加載器和方法信息
ClassLoader classLoader=intefraceInfo.getClassLoader();
Class<?>[] methodInfo={intefraceInfo};
//通過(guò)動(dòng)態(tài)代理對(duì)象執(zhí)行目標(biāo)方法時(shí),系統(tǒng)自動(dòng)調(diào)用invoke
MyInvocationHandler myinvocationHandler=new MyInvocationHandler(intefraceInfo.getName());
return Proxy.newProxyInstance(classLoader, methodInfo, myinvocationHandler);
}
}
package com.jt.service;
public interface CartService {
String findCartById(Long id);
}
動(dòng)態(tài)代理