动态代理与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====

posted @ 2020-04-03 17:06  林淼零  阅读(129)  评论(0编辑  收藏  举报