java代理(AOP)
2013-10-14 16:34
190 查看
AOP是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。使用反射生成JDK动态代理,可以实现面向切面的功能,即AOP,下面通过案例来展示反射在AOP中使用的作用:
package com.xiaomo.reflex; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AOPTest { interface Dog { void info(); void run(); } static class GunDog implements Dog { @Override public void info() { System.out.println("I am a gundog!"); } @Override public void run() { System.out.println("I run fast!"); } } static class Authority { //第一个拦截方法 public void first() { System.out.println("------第一个切面方法------"); } //第二个拦截方法 public void last() { System.out.println("------最后一个切面方法------"); } } static class MyInvocationHandler implements InvocationHandler { //需要被代理的对象 private Object target; public void setTarget(Object target) { this.target = target; } //执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法 public Object invoke(Object proxy, Method method, Object[] args) throws Exception { Authority authority = new Authority(); //执行权限对象中的in方法 authority.first(); System.out.println("正在执行的方法:" + method); //if (args != null) { //System.out.print("执行该方法时传入的实参:"); //for (Object val : args) { //System.out.println(val); //} //} else { //System.out.println("调用该方法没有实参!"); //} System.out.print("执行结果:"); Object result = method.invoke(target, args); //执行权限对象中的out方法 authority.last(); return result; } } static class MyProxyFactory { //为制定的target生成动态代理对象 public static Object getProxy(Object target) throws Exception { //创建一个MyInvocationHandler对象 MyInvocationHandler handler = new MyInvocationHandler(); //为MyInvocationHandler设置target对象 handler.setTarget(target); //创建并返回一个动态代理 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); } } public static void main(String[] args) throws Exception { //创建一个原始的GunDog对象,作为target Dog target = new GunDog(); //以制定的target来创建动态代理对象 Dog dog = (Dog) MyProxyFactory.getProxy(target); dog.info(); dog.run(); } }
运行结果如下:
------第一个切面方法------
正在执行的方法:public abstract void com.xiaomo.reflex.AOPTest$Dog.info()
执行结果:I am a gundog!
------最后一个切面方法------
------第一个切面方法------
正在执行的方法:public abstract void com.xiaomo.reflex.AOPTest$Dog.run()
执行结果:I run fast!
------最后一个切面方法------
出处:/article/1384619.html 作者:伫望碧落
相关文章推荐
- 黑马程序员 java高新技术之代理和AOP原理
- Java JDK 动态代理(AOP)使用及实现原理分析
- java使用动态代理来实现AOP(日志记录)的实例代码
- 【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法
- JavaAop动态代理工具类
- 静态代理的一段java代码关于aop
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- 使用Java动态代理实现AOP
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Java动态代理(三)——模拟AOP实现
- JAVA 动态代理与AOP编程(面向切面编程)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- java动态代理与老式AOP实现
- 黑马程序员_高新技术四(Java动态代理、AOP简单框架)
- Java反射之JDK动态代理实现简单AOP
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)
- JAVA的动态代理模式分析以及与spring AOP的比较
- java spring aop 的代理的简单实现
- Spring AOP之 java 动态代理(Proxy 与 InvocationHandler)理解