频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
Crazy_Javar之反射--->Proxy
2013-10-13 11:53:32           
收藏   我要投稿
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!

------最后一个切面方法------

 

点击复制链接 与好友分享!回本站首页
上一篇:Codeforces Round #205 (Div. 2) B. Two Heaps
下一篇:How to add custom property in custom webpart using VS 2012
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站