zoukankan      html  css  js  c++  java
  • AOP:jdk的动态代理

    1.文件结构

    2.建立接口

    package com.wangcf.manager;
    
    
    public interface IUserManager {
        
        public void add();
        
        public void del();
        
        public void update();
        
        public String load(int uid);
    }

    3.实现接口,里面的所有方法都是切入点PointCut

    package com.wangcf.manager;
    
    
    public class UserManagerImp implements IUserManager{
        @Override
        public void add(){
            System.out.println("UserManagerImp add...");
        }
        @Override
        public void del(){
            System.out.println("UserManagerImp del...");
        }
        @Override
        public void update(){
            System.out.println("UserManagerImp update...");
        }
    
        @Override
        public String load(int uid) {
            // TODO Auto-generatuided method stub
            System.out.println("UserManagerImp load...");
            return "asda"+uid;
        }
    }

    4.切面拦截,切面类aspect

    package com.wangcf.manager;
    
    public class LogManager {
        //advice(通知)
        public static void addLog(){
            System.out.println("添加日志...");
        }
    }

    5.获取代理类

    package com.wangcf.handler;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import com.wangcf.manager.LogManager;
    
    public class MyInvocationHandler implements InvocationHandler{
    
        private Object target;//目标对象
        
        public MyInvocationHandler(Object target) {
            // TODO Auto-generated constructor stub
            this.target=target;
        }
        
        public Object newProxy(){
            Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), 
                    this);
            return proxy;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            // TODO Auto-generated method stub
            System.out.println("MyInvocationHandler invoke...");
            /*
             * 
             */
            LogManager.addLog();
            //去执行目标对象的方法
            System.out.println("args: "+args);
            //去执行目标对象的方法
            Object returnValue = method.invoke(target, args);
            System.out.println("returnValue:"+returnValue);
            return returnValue;
        }
    
    }

    6.测试类

    package com.wangcf.test;
    
    import com.wangcf.handler.MyInvocationHandler;
    import com.wangcf.manager.IUserManager;
    import com.wangcf.manager.UserManagerImp;
    
    public class TestAction {
        public static void main(String[] args) {
         //目标对象userManager IUserManager userManager
    =new UserManagerImp(); //下面这段获取代理 MyInvocationHandler mh=new MyInvocationHandler(userManager); Object proxy=mh.newProxy(); System.out.println(proxy.getClass().getName()); IUserManager userManagerProxy=(IUserManager)proxy; //不带参数add,和load方法称为连接点JoinPoint userManagerProxy.add(); System.out.println("=============="); //带参数 userManagerProxy.load(10); } }

    7.输出:

    8.总结:

    Proxy0是动态获取的代理

    通过连接点进入切面,LogManager为切面类

  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/-beauTiFul/p/6322453.html
Copyright © 2011-2022 走看看