X-Meta引擎是使用Java实现的动态模型引擎。
可以通过World类来初始化模型引擎,其中path参数是模型应用的目录,一般是引擎的工作目录,目录下可以包含类库、模型库和生成的临时文件等。
import org.xmeta.World;
//Java项目可以使用当前目录作为引擎的工作目录
World world = World.getInstance();
world.init(".");
可以通过模型的路径来获取一个模型.模型的路径规则基本同Java类名的规则,只是模型的路径还可以包含子节点的路径。如test.HelloWorldModel是描述者模型的路径。
import org.xmeta.Thing;
//获得描述者模型
Thing thing = world.getThing("test.HelloWorldModel");
//获取属性的值
Object value = thing.get("name");
//设置属性的值
thing.set("name", "Hello World");
//获取属性的值并转为相应的类型,支持常见类型的转换
//一般是getX(Stirng name)方法,其中X是对应的类型
int age = thing.getInt("age");
//注:属性未必需要在模型(XML)中定义,但序列化存储时未定义的属性不会被保存到XML中
//获取模型的子节点
List<Thing> childs = thing.getChilds();
把模型转化为动作执行。
import org.xmeta.Thing;
import org.xmeta.Aciton;
import org.xmeta.ActionContext;
//获取HelloWorldExample模型
Thing helloWorldExample = world.getThing("test.HelloWorldExample");
//转化为动作,和Java做对比动作类似于静态方法
Action helloWorldAction = helloWorldExample .getAction();
//执行动作
//动作和对象的行为执行时需要动作上下文(ActionContext),动作上下文用于管理变量和线程状态等
helloWorldAction.run(new ActionContext());
把模型作为对象,执行它的行为
import org.xmeta.Thing;
import org.xmeta.ActionContext;
//获取HelloWorldExample模型
Thing helloWorldExample = world.getThing("test.HelloWorldExample");
//执行HelloWorldExample的run方法。
//执行对象的行为时,对象本身会以变量名self(相当于this变量)放到动作上下文中,动作可以通过self变量访问对象模型。
helloWorldExample.doAction("run", new ActionContext());
传参数的方法,动作执行时也适用。
//传参,方法1,参数名+参数值,可以设置多个,参数名和参数值成对出现
Object result = thing.doAction("xxx", new ActionContext(), "p1", p1Value, "p2", p2Value...);
//传参,方法2,通过ActionContext设置参数
ActionContext actionContext = new ActionContext();
actionContext.peek().put("p1", p1Value);
actionContext.peek().put("p2", p2Value);
......
Object result = thing.doAction("xxx", actionContext);
动作和行为的区别,执行动作时模型不会把自己作为self变量传入到动作上下文中,而作为对象执行时会。因此动作执行时没有self变量(或self变量不是它自己),而执行对象的行为时self变量是对象模型自身。
如下面代码中self变量,在执行HelloWorldExample模型对象的run行为时,self变量时HelloWorldExample模型自身。
public static void run(ActionContext actionContext){
//模型实例,相当于Java的this变量的作用
Thing self = actionContext.getObject("self");
System.out.println(self.getString("message"));
}
//获取首要描述者(类) Thing descriptor = thing.getDescriptor(); //获取所有描述者(类) List<Thing> descriptors = thing.getDescriptors(); //获取事物名,相当于Java的object.getClass().getSimpleName() String thingName = thing.getThingName(); //获取继承列表 List<Thing> extends = thing.getExtends(); //获取动作行为列表 List<Thing> actions = thing.getActionThings();
Copyright © 2007-2017 XWorker.org 版权所有