反射和动态代理实现上下文切入AOP效果
Java的反射框架提供了动态代理机制,允许在运行期对目标类生成代理,避免重复开发,实现上下文切入的功能。
代码是最好的交流语言:
Subject接口
RealSubject实现接口
SubjectHandler实现上下文切入,非显式动态代理功能
interface Subject {
    public String request(int[] array);
    public void anotherRequest();
}
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");
    }
}
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;
} }
下面是如何调用:
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编程概念
         */
    }
输入如下
预处理...权限校验
real do something
1 2 3
后处理...数据校验 预处理...权限校验
anotherRequest
后处理...数据校验
反射和动态代理实现上下文切入AOP效果的更多相关文章
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
		
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
 - Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
		
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
 - 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
		
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
 - Java反射和动态代理
		
Java反射 反射机制 RTTI 编译器在编译时打开和检查*.class文件 反射机制 运行时打开和检查*.class文件 Java反射常见的方法 java反射的应用 setAccessible(bo ...
 - MyBatis源码解析【4】反射和动态代理
		
通过之前的介绍,我们了解了几个组件的生命周期. 它也是我们重要装备之一. 今天我们需要搞一件更加强的装备,叫做反射和动态代理. 如果没有这件装备的话,显然后面的源码boss是打不动的. 顺便说一下,下 ...
 - CgLib动态代理学习【Spring AOP基础之一】
		
如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...
 - Java反射机制动态代理
		
1.什么事反射机制动态代理 在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接. 2.演示 ...
 - java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))
		
为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦. Proxy类的使用规则 Proxy提 ...
 - java反射和动态代理实现与原理详细分析
		
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
 
随机推荐
- Undefined symbols for architecture x86_64: ( linker command failed with exit code 1)
			
当出现 linker command failed with exit code 1 (use -v to see invocation) 的错误总结,具体内容如下: Undefined symbo ...
 - AI调色板
			
AI新建图层时,要选择CMYK模式,才能出现如下图所示调色板,如果选RGB模式,那么调整颜色的时候只能通过输入RGB.
 - oracle 监控
			
sqlplus "/as sysdba" .监控当前数据库谁在运行什么SQL语句 SELECT osuser, username, sql_text from v$session ...
 - C#中的变量及命名规则
			
变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型 变量名=赋值: 3.常用的数据类型: int 整数类型 取值范围:最大2147483647;最小-214748364 ...
 - Java Web进阶——Filter过滤器
			
一.过滤器的介绍: 在Servlet规范2.3中定义了过滤器,它是一个服务器端的组件,可以截取用户端的请求与响应信息,并且对这些信息进行过滤. Servlet过滤器本身并不生成请求和响应对象,只是提供 ...
 - SQL exists( select 1 from
			
use UnlockIndustry select * from Info_Coordinate as A join Info_Employee on A.EmployeeId=Info_Employ ...
 - SQL Server数据库大型应用解决方案总结(转载)
			
转载地址:http://hb.qq.com/a/20120111/000216.htm 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至 ...
 - 記錄一次CRS-0184: Cannot communicate with the CRS daemon的解決
			
1. 描述: 使用crs_stat –t 命令查看rac服務,直接報CRS-0184: Cannot communicate with the CRS daemon.錯誤 但是奇怪的是我們的DB是沒有 ...
 - PHP导出Excel一个方法轻松搞定
			
/** * 导出数据为excel表格 *@param $data 一个二维数组,结构如同从数据库查出来的数组 *@param $title excel的第一行标题,一个数组,如果为空则没有标题 *@p ...
 - TensorFlow
			
转自:http://blog.csdn.net/stdcoutzyx/article/details/51645396 本片博文是参考文献[1]的阅读笔记,特此声明 TensorFlow,以下简称TF ...