<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
由于Spring2的AOP部分作了比较大的调整,很多地方的使用引入了AspectJ中的内容,为了完成《深入Spring 2:轻量级J2EE开发框架原理与实践》中Spring AOP应用一章的写作,因此这两天把AspectJ研究了一下,重读了一次《AspectJ in action》,受益不少。这里是今天做的一个回合格斗戏示例:
这个示例中有一个设计了一个战士Soldier类,这个类具有一些随机功能,包括发动攻击、治疗、躲避、移动等功能。另外有一个简单的主程序MainTest,里面的功能就是让两个战士回合制互相攻击。另外有一个切面,是用来观察并输入战斗的详细过程,直到一个被打倒下:
先看战士Soldier的代码:
package springroad.demo.chap5.aspectj;
public class Soldier {
private String name;
private int health=100;
private int damage=10;
private int x=10;
private int y=10;
public boolean attack(Soldier target){
boolean ret=false;
if(!target.dodge())
{
target.setHealth(target.getHealth()-this.damage);
ret=true;
}
move();
treat();
return ret;
}
public void move()
{
this.x+=getRandom(5);
this.y+=getRandom(5);
}
//躲避x及y随机变动,成功率为50%
public boolean dodge()
{
return getRandom(10)%2==0;
}
//治疗,具有一定成功的机会,可以提高生命值0-20点
public void treat()
{
if(canTreat())
this.health+=getRandom(20);
}
public boolean canTreat()
{
return getRandom(10)/2==0;
}
private int getRandom(int seed)
{
return RandomUtil.getRandomValue(seed);
}
//getter及setter方法
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
}
再看看MainTest.java中战场模拟的代码(即主程序):
package springroad.demo.chap5.aspectj;
public class MainTest {
public static void main(String[] args) {
Soldier p1=new Soldier();
p1.setName("角色1");
Soldier p2=new Soldier();
p2.setName("角色2");
int i=0;
while(p1.getHealth()>0 && p2.getHealth()>0)
{
p2.attack(p1);
p1.attack(p2);
i+=2;
}
System.out.println("战斗次数:"+i);
if(p1.getHealth()>0)System.out.println(p1.getName()+"战胜!");
else System.out.println(p2.getName()+"战胜!");
}
}
随机数生成器(概率产生)
package springroad.demo.chap5.aspectj;
public class RandomUtil {
private static java.util.Random random=new java.util.Random();
public static int getRandomValue(int seed)
{
return random.nextInt(seed);
}
}
这上面三个程序是完整的,可以直接用javac编译,然后执行MainTest,我们可以看到经过一小段时间战斗后分出胜负后,会显示出战斗的次数及胜负情况。
为了要能观察整个战斗的详细过程,这里在不改动上面的程序代码的情况下,使用AspectJ做了一个切面,主要用来输出攻击的情况。
切面RecordGame.aj的代码如下 :
package springroad.demo.chap5.aspectj;
public aspect RecordGame {
private static java.text.SimpleDateFormat df=new java.text.SimpleDateFormat("yyyy-MM-dd H:m:s");
pointcut doRecord():execution(boolean Soldier.attack(Soldier));
pointcut supperRole(Soldier s): target(s)&&execution(boolean Soldier.canTreat());
after() returning(boolean value) :doRecord()
{
Soldier s=(Soldier)thisJoinPoint.getTarget();
Soldier t=(Soldier)thisJoinPoint.getArgs()[0];
System.out.println(df.format(new java.util.Date())+":"+s.getName()+" 向 "+t.getName()+" 发动了一次攻击!--结果:"+(value?"成功":"失败"));
System.out.println(s.getName()+"生命值:"+s.getHealth()+";"+t.getName()+"生命值:"+t.getHealth());
}
after(Soldier s)returning(boolean value):target(s)&&call(boolean Soldier.canTreat())
{
if(value)System.out.println(s.getName()+"得到治疗!");
}
boolean around(Soldier s): supperRole(s)
{
if("super".equals(s.getName())) return true;
else return proceed(s);
}
}
使用ajt编译上面的四个文件,在命令行输入如下所示命令(要求AspectJ正确安装及配置):
ajc springroad/demo/chap5/*.*j*
然后再使用java 命令执行MainTest即可以看到非常有趣的结果。如下图所示:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1347028
相关推荐
Spring 使用AspectJ 实现 AOP之前置通知小例子,实际跑过,验证可信。
动手写一个AspectJ的gradle插件的demo,详细说明了怎么创建Gradle插件和AspectJ的一些使用方法
面向切面,AspectJ,是一个AspectJ官方提供的用面向切面方法编写的星际战争小游戏,动作非常逼真!
Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)
aspectj-1.7.0.jar aspectj的包
然而,尽管aspectj纳入在eclipse这个日益流行的java开源ide之内,但是找到一种实用、非理论的方式来学习这种语言及其他aop工具和技术已经成为一个实际的问题。 迄今为止,本书提供了实用的解决方案以及大量的代码...
aspectj
Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动
要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar等jar包,文件已打包上传。
学习aspectJ,帮助学习面向方面的知识。
Aspectj开发指南 博文链接:https://g007n.iteye.com/blog/249602
org.aspectj,aspectj项目库(org.aspectj).zip,建筑物
Aop之AspectJ解读demo,主要是讲解Aspectj使用框架以及使用场景入门实例
aspectj-1.7.1.jar
aspectj架包,版本号:aspectj-1.6.9.jar
aspectj配合spring需要jar
AspectJ 1.9 最新1.9第二版,包含源码。AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件
精通AspectJ(面向方面的java编程指南)一书的示例代码。
AspectJ经典实例 用例简单明了,适合初学者!~希望大家能多多交流!~
aspectj development 开发用的不错的东东,亲测可用噢