创建一个class实现InvocationHandler类,重写invoke方法:
import com.alibaba.fastjson.JSON;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxy implements InvocationHandler {
// 这个就是我们要代理的真实对象
private Object subject;
public DynamicProxy(Object subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在代理真实对象前我们可以添加一些自己的操作
System.out.println("before invoke");
System.out.println("params:" + JSON.toJSONString(args));
// 方法
System.out.println("Method:" + method.getName());
// 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(subject, args);
// 在代理真实对象后我们也可以添加一些自己的操作
System.out.println("after invoke");
return null;
}
}
在main方法进行测试一下结果:
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
DynamicProxy dynamicProxy = new DynamicProxy(userService);
/*
* 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数
* 第一个参数dynamicProxy.getClass().getClassLoader() ,我们这里使用dynamicProxy这个类的ClassLoader对象来加载我们的代理对象
* userService.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
* 第三个参数dynamicProxy, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
*/
UserService obj = (UserService) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), userService.getClass().getInterfaces(), dynamicProxy);
System.out.println(obj.getClass().getName());
Map<String, Object> map = new HashMap<>();
map.put("userId", 110);
map.put("userName", "张三丰");
map.put("userSex", "man");
map.put("userAge", 99);
obj.getUser(map);
}
控制台打印结果如下:
com.sun.proxy.$Proxy0
before invoke
params:[{"userSex":"man","userName":"张三丰","userId":110,"userAge":99}]
Method:getUser
after invoke
其实动态代理非常简单,Spring的AOP切面编程底层实现原理就是Java动态代理!