详解Java反射实现Aop代理
利用反射生成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代码
下一篇:对Java中传值调用的理解分析
本文标题:详解Java反射实现Aop代理
本文地址:http://www.codeinn.net/misctech/153598.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




