码迷,mamicode.com
首页 > 其他好文 > 详细

jdk动态代理

时间:2019-05-21 22:44:53      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:port   interface   使用   生成   log   测试   turn   nbsp   ati   

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 }

 

jdk动态代理

标签:port   interface   使用   生成   log   测试   turn   nbsp   ati   

原文地址:https://www.cnblogs.com/yanpingping/p/10902789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!