• jdk动态代理


    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 }
  • 相关阅读:
    Cdnbest的cdn程序默认支持web Socket
    在winsshd 中添加id_rsa.pub 实现Windows 服务器主机自动信任Linux 客户端
    Excel 如何排序与多关键字排序
    JZOJ 6316. djq的朋友圈(状压DP)
    JZOJ 6309. 完全背包(矩阵max)
    JZOJ 6307. 安排(归并排序+分治)
    JZOJ 6299. 2019.08.12【NOIP提高组A】工厂(二分图+状压DP)
    JZOJ 6276. 【noip提高组模拟1】树(DFS序+扫描线)
    JZOJ 6278. 2019.8.5【NOIP提高组A】跳房子 (分块模拟)
    JZOJ 6278. 2019.8.5【NOIP提高组A】跳房子 (分块模拟)
  • 原文地址:https://www.cnblogs.com/yanpingping/p/10902789.html
Copyright © 2020-2023  润新知