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
  • 相关阅读:
    JS键盘码值表
    JS入门笔记
    CSS居中的方法总结
    CSS布局模型思考
    条件、循环、函数定义、字符串操作练习
    Python输入输出练习,运算练习,turtle初步练习
    如何理解Comparator接口中的升降序?
    12个非常实用的JavaScript小技巧
    JAVA泛型知识(一)
    开窗函数简介
  • 原文地址:https://www.cnblogs.com/afangfang/p/12627562.html
Copyright © 2011-2022 走看看