1.Auth 接口
package com.springstudy.aop.proxy; public interface Auth { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); }
2.AuthImpl 实现
package com.springstudy.aop.proxy; public class AuthImpl implements Auth { @Override public int add(int i, int j) { return i + j; } @Override public int div(int i, int j) { return i / j; } @Override public int mul(int i, int j) { return i * j; } @Override public int sub(int i, int j) { return i - j; } }
3.AuthLoggingProxy 代理类(动态代理核心代码)
package com.springstudy.aop.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; public class AuthLoggingProxy { private Auth target; public AuthLoggingProxy(Auth target){ this.target = target; } public Auth getLoggingProxy(){ Auth proxy = null; //代理对象由那个类加载器负责加载 ClassLoader loader = target.getClass().getClassLoader(); //代理对象的类型,即代理对象中有哪些方法 Class[] interfaces = new Class[]{Auth.class}; //当调用代理对象的方法时执行一下方法中的内容 InvocationHandler h = new InvocationHandler(){ /* * (non-Javadoc) * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) * proxy 正在被代理的对象,一般不在invoke方法中调用(会死循环) * method 正在被调用的方法 * args 入参 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodname = method.getName(); //日志 System.out.println("The method " + methodname + "begins with " + Arrays.asList(args)); //方法调用 Object result = method.invoke(target, args); //日志 System.out.println("The method " + methodname + "ends with " + result); return result; } }; proxy = (Auth) Proxy.newProxyInstance(loader, interfaces, h); return proxy; } }
4.Main 主类(测试用)
package com.springstudy.aop.proxy; /* * 动态代理 实现 AOP切面编程 */ public class Main { public static void main(String[] args){ // AuthImpl ai = new AuthImpl(); // int result = ai.add(1, 2); // System.out.println(result); // result = ai.div(4, 2); // System.out.println(result); AuthImpl target = new AuthImpl(); Auth proxy = (Auth) new AuthLoggingProxy(target).getLoggingProxy(); int result = proxy.add(1, 2); System.out.println(result); result = proxy.div(4, 2); System.out.println(result); } }
暂存代码,之后再做总结
package com.springstudy.aop.proxy;
public class AuthImpl implements Auth {
@Overridepublic int add(int i, int j) {return i + j;}
@Overridepublic int div(int i, int j) {return i / j;}
@Overridepublic int mul(int i, int j) {return i * j;}
@Overridepublic int sub(int i, int j) {return i - j;}
}