详解Java反射实现Aop代理
程序员文章站
2024-03-04 15:40:41
利用反射生成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......
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Java面向对象(一)
下一篇: Java IO流-字节流