zoukankan      html  css  js  c++  java
  • 动态代理与AOP

    TestAOP

    package com.aff.dynamic;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    interface Human {
        void info();
        void fly();
    }
    
    // 被代理类
    class SuperMan implements Human {
        @Override
        public void info() {
            System.out.println("我是超人");
        }
    
        @Override
        public void fly() {
            System.out.println("我会飞");
        }
    }
    
    class HumanUtil {
        public void method1() {
            System.out.println("====方法1====");
        }
    
        public void method2() {
            System.out.println("====方法2====");
        }
    }
    
    
    // 代理类
    class MyInvocationHandler2 implements InvocationHandler {
        Object obj;// 声明被代理类对象
    
        public void setObject(Object obj) {
            this.obj = obj;
        }
    
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            HumanUtil h = new HumanUtil();
            // 两个方法中间插入,面向切面
            h.method1();
            Object returnVal = method.invoke(obj, args);
            h.method2();
            return returnVal;
        }
    }
    
    
    // 动态创建一个代理类的对象
    class MyProxy {
        public static Object getProxyInstance(Object obj) {// 通过下面赋值, obj就是被代理类对象
            MyInvocationHandler2 myhandler = new MyInvocationHandler2();
            myhandler.setObject(obj);
    
            return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), myhandler);
        }
    }
    
    
    public class TestAOP {
        public static void main(String[] args) {
            SuperMan sm = new SuperMan();//创建被代理类的对象
            Object  obj = MyProxy.getProxyInstance(sm);//返回代理类的对象
            Human hm = (Human)obj;
            hm.info();//通过代理类的对象调用重写的抽象方法
            System.out.println();
            hm.fly();
        }
    }

    输出结果:

    ====方法1====
    我是超人
    ====方法2====

    
    

    ====方法1====
    我会飞
    ====方法2====

    All that work will definitely pay off
  • 相关阅读:
    Entity Framework 简介
    MongoDB 简述及安装
    js、sql和python版本的乘法口诀对比
    sql 判断输入的日期是否有重叠
    win10 不能调节屏幕亮度 win10 屏幕亮度调节快捷键不能用
    mysql主从配置常见错误处理
    Linux安装mysql总结
    linux安装mongodb总结
    centos安装redis总结
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  • 原文地址:https://www.cnblogs.com/afangfang/p/12627562.html
Copyright © 2011-2022 走看看