使用JDk的Proxy類的靜態方法
newProxyInstance ,讓JVM自動生成一個新的類,類中包含了inerfaces參數中的全部方法,每一個方法都調用h.invoke 方法
AOP 動態代理
package com.atguigu.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
//代理類
public class ArithmeticCalculatorLoggingProxy {
//1.被代理的對象 目標對象
private ArithmeticCalculator target ; // 其實是ArithmeticCalculatorImpl對象.
//經過構造器的方式將目標對象傳入
public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target){
this.target = target ;
}
//獲取代理對象
public ArithmeticCalculator getLoggingProxy(){
//定義代理對象
ArithmeticCalculator proxy ;
/**
* loader: ClassLoader 類加載器
* interfaces: 目標類的全部接口,目的是獲取接口中的方法
* h: InvocationHandler
*/
ClassLoader loader = target.getClass().getClassLoader();
Class[] interfaces = target.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
/**
* proxy:代理對象 在invoke方法中通常不會用
* method:正在調用的方法
* args:調用方法傳入的參數
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String methodName = method.getName();
//加日誌
System.out.println("ATGUIGU===>The method "+methodName+" begins with "+ Arrays.asList(args));
//執行目標方法
Object result = method.invoke(target, args);
//加日誌
System.out.println("ATGUIGU===>The method "+methodName+" ends with " + result );
return result;
}
};
proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);
使用JDk的Proxy的靜態方法
newProxyInstance ,讓JVM自動生成一個新的類,類中包含了inerfaces參數中的全部方法,每一個方法都調用h.invoke 方法
return proxy ;
}
}