首页 > 编程 > Java > 正文

Java动态代理和AOP应用示例

2019-11-26 08:49:11
字体:
来源:转载
供稿:网友

本文实例讲述了Java动态代理和AOP应用。分享给大家供大家参考,具体如下:

一 点睛

动态代理在AOP(Aspect Orient Program,即面向切面编程)里被称为AOP代理,AOP代理可代替目标对象,AOP代理包含了目标对象的全部方法。但AOP代理中的方法与目标对象的方法存在差异:AOP代理里的方法可以在执行目标方法之前、之后插入一些通用处理。

二 代码

Dog.java

public interface Dog{  // info方法声明  void info();  // run方法声明  void run();}

GunDog.java

public class GunDog implements Dog{  // 实现info()方法,仅仅打印一个字符串  public void info()  {    System.out.println("我是一只猎狗");  }  // 实现run()方法,仅仅打印一个字符串  public void run()  {    System.out.println("我奔跑迅速");  }}

DogUtil.java

public class DogUtil{  // 第一个拦截器方法  public void method1()  {    System.out.println("=====模拟第一个通用方法=====");  }  // 第二个拦截器方法  public void method2()  {    System.out.println("=====模拟通用方法二=====");  }}

MyInvokationHandler.java

import java.lang.reflect.*;public class MyInvokationHandler 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  {    DogUtil du = new DogUtil();    // 执行DogUtil对象中的method1。    du.method1();    // 以target作为主调来执行method方法    Object result = method.invoke(target , args);    // 执行DogUtil对象中的method2。    du.method2();    return result;  }}

MyProxyFactory.java

import java.lang.reflect.*;public class MyProxyFactory{  // 为指定target生成动态代理对象  public static Object getProxy(Object target)    throws Exception    {    // 创建一个MyInvokationHandler对象    MyInvokationHandler handler =    new MyInvokationHandler();    // 为MyInvokationHandler设置target对象    handler.setTarget(target);    // 创建、并返回一个动态代理    return Proxy.newProxyInstance(target.getClass().getClassLoader()      , target.getClass().getInterfaces() , handler);  }}

Test.java

public class Test{  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();  }}

三 运行

E:/Java/疯狂java讲义/codes/18/18.5/DynaProxy>java Test
=====模拟第一个通用方法=====
我是一只猎狗
=====模拟通用方法二=====
=====模拟第一个通用方法=====
我奔跑迅速
=====模拟通用方法二=====

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表