欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Java反射实现Aop代理

程序员文章站 2024-03-02 23:31:04
利用反射生成jdk的动态代理,也就是aop中的aop代理,代替目标对象,从而在代码中织入增强。 定义代理接口 由于jdkf动态代理只能为接口创建动态代理,故先定义接口,...

利用反射生成jdk的动态代理,也就是aop中的aop代理,代替目标对象,从而在代码中织入增强。

定义代理接口

由于jdkf动态代理只能为接口创建动态代理,故先定义接口,假定我们需要对数据的save方法添加事务处理,我们有一个userdao接口,里面有一个save方法,代码如下:

public interface userdao {
  public void save();
}

定义代理实现

下面具体来实现接口定义的save方法,我们采用下面的代码来实现。

public class userdaoimpl implements userdao {

  @override
  public void save() {
    system.out.println("i am save user....");
  }

}

定义增强代码

我们有如下的操作,在保存用户之前打开事务,在保存用户之后提交事务,在增强代码中定义两个方法before()和after(),分别用在save()方法的执行开始之前和执行之后。

public class usertx {
  public void before(){
    system.out.println("before save.....");
  }
  public void after(){
    system.out.println("after save......");
  }
}

定义invocation handler

之所以要定义handler是因为执行动态代理时,实际执行的是handler里面的invoke()方法,这样的话,我们在invoke()方法里面自定义方法的内容,从而就达到了代理和增强的逻辑和效果。

public class userdaoinvocationhandler implements invocationhandler {
  /
   需要代理的对象
   /
  private object proxyobj;
  /
   指定我们需要代理的对象
   @param proxyobj
   */
  public void setproxyobj(object proxyobj) {
    this.proxyobj = proxyobj;
  }
  @override
  public object invoke(object proxy, method method, object[] args)
      throws throwable {
    usertx tx = new usertx();
    tx.before();
    object resultobj = method.invoke(proxyobj, args);
    tx.after();
    return resultobj;
  }
}

测试结果

上面已经定义好所有的东西,我们就实际来动态代理我们指定的对象,用代理后的对象来执行我们要执行的方法,验证是否代理成功。

import java.lang.reflect.proxy;
public class proxytst {
  public static void main(string[] args) {
    // proxy object
    userdao target = new userdaoimpl();
    // invocation handler
    userdaoinvocationhandler handler = new userdaoinvocationhandler();
    handler.setproxyobj(target);
    // proxy
    userdao targeted = (userdao) proxy.newproxyinstance(
        target.getclass().getclassloader(),
        target.getclass().getinterfaces(),
        handler);
    // execute proxyed object
    targeted.save();
  }
}

执行上面的代码之后我们可以在控制台看见如下的输出,证明userdao已经被成功代理,同时我们也为我们的程序成功的添加了事务功能。

before save.....
i am save user....
after save......

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。