首页 > 其他 > 详细

反射和动态代理实现上下文切入AOP效果

时间:2014-03-29 18:17:22      阅读:462      评论:0      收藏:0      [点我收藏+]

Java的反射框架提供了动态代理机制,允许在运行期对目标类生成代理,避免重复开发,实现上下文切入的功能。

代码是最好的交流语言:

Subject接口

RealSubject实现接口

SubjectHandler实现上下文切入,非显式动态代理功能

interface Subject {
    public String request(int[] array);
    
    public void anotherRequest();
}
bubuko.com,布布扣
public class RealSubject implements Subject {

    @Override
    public String request(int[] array) {
        System.out.println("real do something");
        for(int at:array) {
            System.out.print(at+" ");
        }
        System.out.println();
        return "";
    }

    @Override
    public void anotherRequest() {
        System.out.println("anotherRequest");
    }
    
    
    public void ownMethod() {
        System.out.println("ownMethod");
    }
    
}
bubuko.com,布布扣

 

bubuko.com,布布扣
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


public class SubjectHandler implements InvocationHandler{

    private Subject subject;
    public SubjectHandler(Subject _subject) {
        subject = _subject;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("预处理...权限校验");
        Object obj = method.invoke(subject, args);
        System.out.println("后处理...数据校验");
        return obj;
    }
    
}
bubuko.com,布布扣

 

下面是如何调用:

bubuko.com,布布扣
public static void main(String[] args) {
        
        Subject subject = new RealSubject();
        InvocationHandler handler = new SubjectHandler(subject);
        ClassLoader cl = subject.getClass().getClassLoader();
        /*
         * Returns an instance of a proxy class for the specified interfaces 
         * that dispatches method invocations to the specified invocation handler.
         * 传入的是Subject接口的所有方法
         */
        Subject proxy = (Subject) Proxy.newProxyInstance(cl, subject.getClass().getInterfaces(), handler);
        
        //调用其中一个方法,有传入参数和返回参数
        int[] array = {1,2,3};
        String a =proxy.request(array);
        System.out.println(a);
        
        //调用另外一个方法
        proxy.anotherRequest();
        /**
         * 用了代理和反射实现了上下文切入!
         * 不需要显式创建代理类即实现代理功能,而且不仅仅代理Subject,
         * 在handler中读取持久化数据即可实现动态代理,而且invoke上下处理,还可以实现动态切入的效果,这也是AOP编程概念
         */
        
    }
bubuko.com,布布扣

输入如下

bubuko.com,布布扣
预处理...权限校验
real do something
1 2 3 
后处理...数据校验

预处理...权限校验
anotherRequest
后处理...数据校验
bubuko.com,布布扣

反射和动态代理实现上下文切入AOP效果,布布扣,bubuko.com

反射和动态代理实现上下文切入AOP效果

原文:http://www.cnblogs.com/yanghuahui/p/3632636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!