Actionscript 3 用于延迟实例化的Flex强类型代理类
有人知道框架吗?最好是让Flex编译器运行扩展的某种方式,或者可能只是一个构建步骤,我们可以生成应用程序数据模型的强类型代理类 我们希望对代理服务器执行两项主要操作:Actionscript 3 用于延迟实例化的Flex强类型代理类,actionscript-3,apache-flex,code-generation,proxy-classes,graniteds,Actionscript 3,Apache Flex,Code Generation,Proxy Classes,Graniteds,有人知道框架吗?最好是让Flex编译器运行扩展的某种方式,或者可能只是一个构建步骤,我们可以生成应用程序数据模型的强类型代理类 我们希望对代理服务器执行两项主要操作: 在运行时,我们希望在被访问时惰性地解析和实例化实例(类似于Java的Hibernate如何具有惰性代理对象) 在编辑器应用程序中,我们希望实现setter调用,以便跟踪已修改的对象 在这种情况下,除了通过编程设置ChangeWatther之外,代理是非常必要的,因为我们需要跟踪数组的添加/删除,并可能跟踪“引用”对象,这样当“引
- 在这种情况下,除了通过编程设置ChangeWatther之外,代理是非常必要的,因为我们需要跟踪数组的添加/删除,并可能跟踪“引用”对象,这样当“引用键”被更改时,我们就可以保存那些按键引用它的对象
[Bindable]
public class PersonDTO implements Serializable {
private var _name:String;
private var _age:Number
public function get age():Number {
return _age;
}
public function set age(a:Number):void {
_age = a;
}
public function get name():String {
return _name;
}
public function set name(n:String):void {
_name = n;
}
public void readObject(data:*) {
//...
}
}
// GENERATED CLASS BASED ON PersonDTO
public class LazyProxy_PersonDTO extends PersonDTO {
private var _instance:PersonDTO = null;
private var _instanceData:*;
private function getInstance():void {
if (_instance == null) {
_instance = new PersonDTO();
_instance.readObject(_instanceData);
}
}
override public function get age():Number {
//Ensure object is instantiated
return getInstance().age;
}
override public function get name():String {
//Ensure object is instantiated
return getInstance().name;
}
}
// GENERATED CLASS BASED ON PersonDTO
public class LogChangeProxy_PersonDTO extends PersonDTO {
//This will be set in the application
public var instance:PersonDTO;
//set by application
public var dirtyWatcher:DirtyWatcherManager;
override public function set age(a:Number):void {
dirtyWatcher.markAsDirty(instance);
instance.age = a;
}
}
深入挖掘AS3 Commons字节码库,看起来它们支持生成代理类和拦截器
public class DirtyUpdateInterceptor implements IInterceptor {
public function DirtyUpdateInterceptor() {
super();
}
public function intercept(invocation:IMethodInvocation):void {
if (invocation.kind === MethodInvocationKind.SETTER) {
if (invocation.arguments[0] != invocation.instance[invocation.targetMember]) {
invocation.instance.isDirty = true;
}
}
}
}