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为切面类

  • 相关阅读:
    数组-11. 猴子选大王
    *数组-10. 求整数序列中出现次数最多的数
    数组-07. 求一批整数中出现最多的个位数字
    *数组-05. 字符串字母大小写转换
    数组-04. 查找整数
    《结对-网页贪吃蛇-最终程序》
    Forward团队-爬虫豆瓣top250项目-项目进度
    《结对-HTML贪吃蛇游戏项目-测试过程》
    课后作业-阅读任务-阅读提问-2
    《20171005-构建之法:现代软件工程-阅读笔记》
  • 原文地址:https://www.cnblogs.com/-beauTiFul/p/6322453.html
Copyright © 2011-2022 走看看