jdk动态代理不需要引入jar包,是jdk自带的。
一、创建代理类对象生成器
原来静态代理需要创建目标类的代理类,现在使用代理类对象生成器可以生成任何接口的实现类的代理对象。
1 package com.aaa.proxy;p g p y 2 import com.aaa.proxy.advice.LogAdvice; 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Methodimport java.lang.reflect.Proxy; 5 /** 6 * jdk的动态代理类对象生成器 7 */ 8 public class JdkDynamicUtil implements InvocationHandler { 9 private Object target; 10 /** 11 * 获取代理对象的方法 12 * @param target 目标类的对象 13 * @return 目标类对象的代理对象 14 */ 15 public Object bind(Object target){ 16 this.target = target; 17 //第一个参数,传递目标类接口的类加载器 18 //第二个参数,传递目标类实现的接口 19 //第三个参数,传递 InvocationHandler接口的实现类对象 20 return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); 21 } 22 @Override 23 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 24 //通过反射调用目标类的方法 25 //第一个参数,是目标类对象 26 Object result = method.invoke(target, args); 27 //记录操作日志 28 //获取方法名 29 String methodName = method.getName(); 30 new LogAdvice().log(methodName); 31 return result; 32 } 33 }
二、测试
1 package com.aaa.proxy.test; 2 import com.aaa.proxy.JdkDynamicUtil; 3 import com.aaa.proxy.entity.Roleimport com.aaa.proxy.entity.User; 4 import com.aaa.proxy.service.RoleServiceimport com.aaa.proxy.service.UserServiceimport com.aaa.proxy.service.impl.RoleServiceImpl; 5 import com.aaa.proxy.service.impl.UserServiceImpl; 6 /** 7 * 测试jdk动态代理*/ 8 public class Test02 { 9 public static void main(String[] args) { 10 //创建一个jdk代理对象生成器 11 JdkDynamicUtil proxyUtil = new JdkDynamicUtil(); 12 //先代理第一个目标类的对象 UserService 13 UserService userService = new UserServiceImpl(); 14 //通过jdk的代理对象生成器 创建代理类对象 15 UserService userServiceProxy = (UserService) proxyUtil.bind(userService); 16 //通过代理类对象调用目标类对象的方法 17 userServiceProxy.saveUser(new User()); 18 userServiceProxy.deleteUser(new User()); 19 userServiceProxy.findById(20L); 20 //再代理第二个目标类的对象 RoleService 21 RoleService roleService = new RoleServiceImpl(); 22 //创建代理对象 23 RoleService roleServiceProxy =(RoleService) proxyUtil.bind(roleService); 24 roleServiceProxy.saveRole(new Role()); 25 roleServiceProxy.deleteRole(new Role()); 26 roleServiceProxy.findById(10L); 27 } 28 }