面向切面编程(AOP = Aspect Oriented Programming)核心就是动态代理机制。动态代理在实现阶段不需要关系代理哪一个类,不用实现具体某个类的代理类。本文通过AOP框架的实现来学习动态代理。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | package com.climbran.designPatterns.proxy;
 
 * Created by swe on 15/9/22.
 * 业务接口
 */
 public interface Subject {
 
 public void doSomething(String str);
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | package com.climbran.designPatterns.proxy;
 
 * Created by swe on 15/9/22.
 * 被代理类
 */
 public class RealSubject implements Subject {
 
 
 public void doSomething(String str){
 System.out.println("do something: " +str);
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | package com.climbran.designPatterns.proxy;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 
 
 * Created by swe on 15/9/22.
 * 业务处理类,对被代理对象操作进行处理
 */
 public class DynamicProxyHandle implements InvocationHandler {
 private Object targer = null;
 
 public DynamicProxyHandle(Object obj){
 targer = obj;
 }
 
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
 
 if(method.getName().equalsIgnoreCase("doSomething"))
 new BeforeAdvice().exec();
 
 return method.invoke(targer, args);
 }
 
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | package com.climbran.designPatterns.proxy;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 
 
 * Created by ywq on 15/9/22.
 * 代理类
 */
 public class DynamicProxy<T> {
 public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler){
 
 
 
 return (T) Proxy.newProxyInstance(loader, interfaces, handler);
 }
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 
 | package com.climbran.designPatterns.proxy;
 
 * Created by ywq on 15/9/22.
 */
 public interface IAdvice {
 public void exec();
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | package com.climbran.designPatterns.proxy;
 
 
 * Created by ywq on 15/9/22.
 */
 public class BeforeAdvice implements IAdvice {
 public void exec(){
 System.out.println("do before advice");
 }
 }
 
 | 
最后客户端进行调用:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | package com.climbran.designPatterns.proxy;
 import java.lang.reflect.InvocationHandler;
 
 
 * Created by swe on 15/9/22.
 */
 public class Client {
 
 public static void main(String[] args){
 Subject subject = new RealSubject();
 
 InvocationHandler handler = new DynamicProxyHandle(subject);
 
 Class<?> cla = subject.getClass();
 Subject proxy = DynamicProxy.newProxyInstance(cla.getClassLoader(), cla.getInterfaces(),handler);
 
 proxy.doSomething("test");
 }
 
 }
 
 |