20160126--springaop

package com.hanqi;

public interface IJiSuanQi {
    
    public int jia(int a , int b);
    public int jian(int a , int b);
    public int cheng(int a, int b);
    public int chu(int a, int b);
    

}
IJiSuanQi
package com.hanqi;

public class MyJSQ implements IJiSuanQi {

    @Override
    public int jia(int a, int b) {
        // 记录日志
//        System.out.println("加法调用前");
        return a + b;
    }

    @Override
    public int jian(int a, int b) {
        // 记录日志
//        System.out.println("减法调用前");
        return a - b;
    }

    @Override
    public int cheng(int a, int b) {
        // 记录日志
//        System.out.println("乘法调用前");
        return a * b;
    }

    @Override
    public int chu(int a, int b) {
        // 记录日志
//        System.out.println("除法调用前");
        return a / b;
    }

}
MyJSQ
package com.hanqi;

public class Main {

    public static void main(String[] args) {
        
        IJiSuanQi jsq = new MyJSQ();
        
        //生成代理
        LoggingProxy lo = new LoggingProxy(jsq);
        
        jsq = lo.getProxy();
        
        System.out.println("加法 = " + jsq.jia(100, 200));
        System.out.println("减法 = " + jsq.jian(100, 200));
        System.out.println("乘法 = " + jsq.cheng(100, 200));
        System.out.println("除法 = " + jsq.chu(100, 20));

    }

}
Main
package com.hanqi;

import java.lang.reflect.*;

/*
 *   代理类
 */
public class LoggingProxy {
    
    
    public LoggingProxy(IJiSuanQi target) {
        super();
        this.target = target;
    }

    //要代理的对象,目标对象
    private IJiSuanQi target;
    
    //应用通知,并产生代理对象
    public IJiSuanQi getProxy()
    {
        IJiSuanQi rtn = null;
        
        //应用通知
//        ClassLoader        //类加载器
        ClassLoader cl = target.getClass().getClassLoader();
        
        Class[] al = new Class[] {IJiSuanQi.class};
        
        InvocationHandler ih = new InvocationHandler() {
            
            /*
             * proxy: 代理对象,一般不使用该对象  
             *  method:正在被调用的方法
             *  args: 调用方法传入的参数
             */
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                
                // 加通知  日志
                System.out.println(method.getName() + "开始调用");
                
                //反射调用
                Object obj = method.invoke(target, args);
                
                // 加通知  日志
                System.out.println(method.getName() + "结束调用");
                
                return obj;
            }
        };
        
        //产生代理对象
        /**
         * loader: 代理对象使用的类加载器
         * interfaces:指定代理对象的类型,即代理对象中可以有哪些方法
         * h: 当具体调节代理对象的方法时,应该如何进行响应,实际上就是调用  InvocationHandler  的    Invocation
         */
        rtn = (IJiSuanQi)Proxy.newProxyInstance(cl, al, ih);
        
        return rtn;
        
    }
    

}
LoggingProxy

posted @ 2016-01-26 20:47  業&裳  阅读(271)  评论(0编辑  收藏  举报