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); }
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; } }
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)); } }
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; } }