package com.atguigu.pojo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
* @author Mr.Lu
* @version 1.0
* @date 2023-07-27 15:13
*/
public class ProxyFactoryUtils {
// 代理对象
private Object target;
public ProxyFactoryUtils(Object target){
this.target = target;
}
public Object getProxy(){
/**
* ClassLoader loader: 加载动态生成的代理类的类加载器
* Class<?>[] interfaces: 目标对象实现的所有接口的class对象所组成的数组
* InvocationHandler h: 设置代理对象实现目标对象方法的过程,即代理类中如何重写接口中的抽象方法
*/
ClassLoader loader = target.getClass().getClassLoader();
Class[] interfaces = target.getClass().getInterfaces();
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* Object proxy: 代理对象本身,一般不管
* Method method: 正在被代理的方法
* Object[] args: 被代理方法,应该传入的参数
*/
System.out.println("在方法之前添加的功能....." + method.getName() + ", " + Arrays.toString(args));
// 执行代理的方法
Object res = method.invoke(target, args);
System.out.println("在方法之后添加的功能....." + res);
return res;
}
};
return Proxy.newProxyInstance(loader, interfaces, handler);
}
}
package com.atguigu;
import com.atguigu.pojo.Calculator;
import com.atguigu.pojo.CalculatorStaticProxy;
import com.atguigu.pojo.ProxyFactory;
import com.atguigu.pojo.ProxyFactoryUtils;
import com.atguigu.pojo.impl.CalculatorImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Mr.Lu
* @version 1.0
* @date 2023-07-25 10:26
*/
public class MyAOPTest {
@Test
public void testProxy(){
/**
* Calculator是一个接口,里面定义了加减乘除方法, CalculatorImpl类是该接口的具体实现类
*/
ProxyFactoryUtils proxyFactoryUtils = new ProxyFactoryUtils(new CalculatorImpl());
Calculator proxy = (Calculator)proxyFactoryUtils.getProxy(); // 这里只能使用接口来进行强制转换,不能使用具体的实现类
proxy.add(1, 1);
}
}