S2Aop浅析

简介: java类 Java代码   public class MyCls {        public void add(int a, int b){            System.
java类

Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. public class MyCls {   
  2.     public void add(int a, int b){   
  3.         System.out.println(a+b);   
  4.     }   
  5. }  
拦截器
Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. import org.aopalliance.intercept.MethodInvocation;   
  2. import org.seasar.framework.aop.interceptors.AbstractInterceptor;   
  3.   
  4. public class MyInterceptor extends AbstractInterceptor {   
  5.     private static final long serialVersionUID = 8348047103038121708L;   
  6.   
  7.     public Object invoke(MethodInvocation invocation) throws Throwable {   
  8.         // TODO Auto-generated method stub   
  9.         System.out.println("BEGIN");   
  10.         Object ret = invocation.proceed();   
  11.         System.out.println("END");   
  12.         return ret;   
  13.     }   
  14.   
  15. }  
配置
Xml代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. xml version="1.0" encoding="Shift_JIS"?>  
  2. nbsp;components PUBLIC "-//SEASAR//DTD S2Container//EN"   
  3. "http://www.seasar.org/dtd/components.dtd">  
  4. components>  
  5.     include path="dao.dicon"/>  
  6.     component class="jp.co.test.MyCls">  
  7.         aspect pointcut="add">  
  8.             component class="jp.co.test.interceptor.MyInterceptor"/>  
  9.         aspect>  
  10.     component>  
  11. components>  
调用
Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. public static void main(String[] args) {   
  2.     // TODO Auto-generated method stub   
  3.     S2Container container = S2ContainerFactory.create("testapp.dicon");   
  4.     container.init();   
  5.     MyCls myCls = (MyCls) container.getComponent(MyCls.class);   
  6.     myCls.add(12);   
  7. }  

java源文件
Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. org/seasar/framework/aop/javassist/AbstractGenerator.java  
的173行
Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. public Class toClass(final ClassLoader classLoader, final CtClass ctClass)   
中体添加以下代码
Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. File file = new File("D:\\gencls\\cls\\"+ctClass.getSimpleName()+".class");   
  2. FileOutputStream fos = new FileOutputStream(file);   
  3. fos.write(bytecode);   
  4. fos.flush();   
  5. fos.close();  
把动态生成的类保存起来。

把类反编译一下
Java代码 复制代码  收藏代码img_3d0b4cacdc5d213eebebbe13f1dc9910.gif
  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.   
  2. // Jad home page: http://www.kpdus.com/jad.html   
  3. // Decompiler options: packimports(3)    
  4. // Source File Name:   MyCls$$EnhancedByS2AOP$$9f671b.java   
  5.   
  6. package jp.co.test;   
  7.   
  8. import java.lang.reflect.UndeclaredThrowableException;   
  9.   
  10. // Referenced classes of package jp.co.test:   
  11. //            MyCls   
  12.   
  13. public class MyCls$$EnhancedByS2AOP$$9f671b extends MyCls   
  14. {   
  15.   
  16.     public void add$$invokeSuperMethod$$(int i, int j)   
  17.     {   
  18.         super.add(i, j);   
  19.         Object _tmp = null;   
  20.     }   
  21.   
  22.     public void add(int i, int j)   
  23.     {   
  24.         try  
  25.         {   
  26.             class .MethodInvocation..add0   
  27.                 implements S2MethodInvocation   
  28.             {   
  29.   
  30.                 public Class getTargetClass()   
  31.                 {   
  32.                     return targetClass;   
  33.                 }   
  34.   
  35.                 public Method getMethod()   
  36.                 {   
  37.                     return method;   
  38.                 }   
  39.   
  40.                 public AccessibleObject getStaticPart()   
  41.                 {   
  42.                     return method;   
  43.                 }   
  44.   
  45.                 public Object getParameter(String name)   
  46.                 {   
  47.                     if(parameters == null)   
  48.                         return null;   
  49.                     else  
  50.                         return parameters.get(name);   
  51.                 }   
  52.   
  53.                 public Object getThis()   
  54.                 {   
  55.                     return target;   
  56.                 }   
  57.   
  58.                 public Object[] getArguments()   
  59.                 {   
  60.                     return arguments;   
  61.                 }   
  62.   
  63.                 public Object proceed()   
  64.                     throws Throwable   
  65.                 {   
  66.                     if(interceptorsIndex 
  67.                     {   
  68.                         return interceptors[interceptorsIndex++].invoke(this);   
  69.                     } else  
  70.                     {   
  71.                         ((MyCls..EnhancedByS2AOP.._cls9f671b)target).add$$invokeSuperMethod$$(((Number)arguments[0]).intValue(), ((Number)arguments[1]).intValue());   
  72.                         return null;   
  73.                     }   
  74.                 }   
  75.   
  76.                 private static Class targetClass;   
  77.                 private static Method method;   
  78.                 private static MethodInterceptor interceptors[];   
  79.                 private static Map parameters;   
  80.                 private Object target;   
  81.                 private Object arguments[];   
  82.                 private int interceptorsIndex;   
  83.   
  84.             public .MethodInvocation..add0(Object target, Object arguments[])   
  85.             {   
  86.                 this.target = target;   
  87.                 this.arguments = arguments;   
  88.             }   
  89.             }   
  90.   
  91.             Object obj = (new .MethodInvocation..add0(thisnew Object[] {   
  92.                 new Integer(i), new Integer(j)   
  93.             })).proceed();   
  94.             return;   
  95.         }   
  96.         catch(RuntimeException runtimeexception)   
  97.         {   
  98.             throw runtimeexception;   
  99.         }   
  100.         catch(Error error)   
  101.         {   
  102.             throw error;   
  103.         }   
  104.         catch(Throwable throwable)   
  105.         {   
  106.             throw new UndeclaredThrowableException(throwable);   
  107.         }   
  108.     }   
  109.   
  110.     public MyCls$$EnhancedByS2AOP$$9f671b()   
  111.     {   
  112.     }   
  113. }  
目录
相关文章
|
3月前
|
监控 安全 Java
|
4月前
|
Java 编译器 Spring
|
3月前
|
中间件 Java Go
你知道什么是 AOP 吗?
你知道什么是 AOP 吗?
58 0
|
5月前
|
缓存 Java API
AOP切面编程
AOP切面编程
|
XML Java 数据格式
三、AOP(二)
三、AOP(二)
79 0
|
XML Java 数据格式
三、AOP(一)
三、AOP(一)
78 0
三、AOP(一)
|
Java
AOP详细介绍
AOP(Aspect-Oriented Programming)是一种编程范式,旨在通过将横切逻辑(cross-cutting concerns)从核心业务逻辑中分离出来,以提高代码的可维护性和可重用性。在Java中,AOP可以通过动态代理来实现。
497 0
|
监控 Java 数据安全/隐私保护
什么是AOP?
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,通过将横切关注点(Cross-cutting Concerns)从核心业务逻辑中分离出来,使得代码的组织结构更清晰,易于维护和扩展。
277 0
|
Java Spring
实现一个简单的AOP
实现一个简单的AOP
|
数据安全/隐私保护
你不是说你会Aop吗?
你不是说你会Aop吗?
124 0