代码1:使用安全的rand()替代原来相对薄弱的rand()。
Rand.java
/* * 项目名称 AspectJShow * 包 名 aop.demo1 * 文 件 名 Rand.java * 创建日期 2005-4-7 */ package aop.demo1; /** * 类名 Rand * * 提供非安全的rand()方法。 * * @author DigitalSonic */ public class Rand { public static void main(String[] args) { rand(); } /** * 非安全的rand()方法。 * * @return -1 */ public static int rand() { System.out.println("The undesirable rand() method is called."); return -1; } }
Secure_Rand.aj
/* * 项目名称 AspectJShow * 包 名 aop.demo1 * 文 件 名 Secure_Rand.aj * 创建日期 2005-4-7 */ package aop.demo1; /** * 方面名 Secure_Rand * * 提供安全的rand()方法。 * * @author DigitalSonic */ public aspect Secure_Rand { pointcut Rand() : call(public static int rand()); //切入点 int around() : Rand() { System.out.println("Security rand() method is called."); return 1; } }
代码2:检查malloc()返回是否正常,这里我新建一个String[]代替C中的malloc()。
Malloc.java
/* * 项目名称 AspectJShow * 包 名 aop.demo2 * 文 件 名 Malloc.java * 创建日期 2005-4-7 */ package aop.demo2; /** * 类名 Malloc * * 提供非安全的malloc()方法。 * * @author DigitalSonic */ public class Malloc { public static void main(String[] args) { malloc(10); } /** * 非安全的malloc()方法。 * * @param Size 数组的大小 * @return String[] 生成的数组 */ public static String[] malloc(int Size) { System.out.println("Unsafe malloc(" + Size + ") method is called."); return new String[Size]; } }
Malloc_Check.aj
/* * 项目名称 AspectJShow * 包 名 aop.demo2 * 文 件 名 Malloc_Check.aj * 创建日期 2005-4-7 */ package aop.demo2; /** * 方面名 Malloc_Check * * 提供malloc_check()方法。 * * @author DigitalSonic */ public aspect Malloc_Check { pointcut Malloc() : call(public static String[] malloc(int)); after() returning(String[] RetrunValue) : Malloc() { if (!(RetrunValue instanceof String[])) { System.out.println("malloc() failed. Exiting..."); System.exit(-1); } else System.out.println("String[" + RetrunValue.length + "] is constructed."); } }
代码3:综合上述两端代码,加上一个Debug,在init_msg()前后各输出一段文字。
ComprehensiveDemo.java
/* * 项目名称 AspectJShow * 包 名 aop.demo3 * 文 件 名 ComprehensiveDemo.java * 创建日期 2005-4-7 */ package aop.demo3; import aop.demo1.*; import aop.demo2.*; /** * 类名 ComprehensiveDemo * * 综合范例 * * @author DigitalSonic */ public class ComprehensiveDemo { public static void main(String[] args) { String[] Msg; int i; Msg = init_msg(4); i = Rand.rand() % 4; System.out.println(Msg[i]); } /** * 生成一个字符串数组。 * * @param Size 数组大小 * @return String[] 字符串数组 */ public static String[] init_msg(int Size) { System.out.println("Message Number " + Size); return Malloc.malloc(Size); } }
Debug.java
/* * 项目名称 AspectJShow * 包 名 aop.demo3 * 文 件 名 Debug.aj * 创建日期 2005-4-7 */ package aop.demo3; /** * 方面名 Debug * * @author DigitalSonic */ public aspect Debug { pointcut init_msg() : call(public static String[] init_msg(int)); before() : init_msg() { System.out.println("Entering init_msg."); } after() : init_msg() { System.out.println("Leaving init_msg."); } }
环境:Eclipse 3.01+AJDT 1.2.1+JDK1.5