- 浏览: 66328 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jssqsgzh:
mark
五年编程两茫茫 2dx初探 -
washingj:
editorSaving = true; 和editorSa ...
GEF简单工作流,保存为xml和图片 -
cxw640560:
editorSaving = true; 和editorSa ...
GEF简单工作流,保存为xml和图片 -
sam_kee:
其实有个更好的方法,applicationComplete事件 ...
flex mx:Application的初始化方法stage属性为null -
张斌梁林:
Flex4 自定义皮肤的使用方法
项目中需要将以前的java代码转到flex中,手动写非常费劲.然后用baidu搜,csnd上有资源,但杯具的发现全都要资源分,而更杯具的是自己的资源分已经是负数.只能感慨了一下国人的开源精神和奉献精神又创新低.
google搜,无果.
最后用俺相当烂的英语拼了一下"Converting Java to ActionScript 3" 没想到竟然找到了.只恨百度不争气,甘做井底之蛙.csdn太功利,外国的开源项目到它那就要积分了.悲哀.最后,就恨自己英语太差了.不想看老外的文章……
言归正传,最终发现了J2AS3 这个开源项目,地址如下:http://code.google.com/p/j2as3/
一老外写的,不过有一些缺陷,就是对java的泛型支持的不是太好,不能转换泛型.
又在网上搜了一下啊,发现有一个哥们已经使用过并且写出了十分不错的使用行的.在此表示敬意.
地址如下:http://blog.sina.com.cn/s/blog_67532f7c0100ozbv.html
全文如下:
有些情况下我们需要将Java类转换成AS3类,比如使用Flash Remoting时,为了方便映射,我们会在AS3中定义与Java后台相关的值对像,用于序列化与反序列化。如果要互通的类有很多,手工去建立这两端的类太麻烦了。
在网上搜到了一个将Java 类文件转换为AS3类文件的开源项目,J2as3:http://code.google.com/p/j2as3/
在使用这个工具转换由Jaxb生的ImsQti_v2p1规范中的java类为as3类时,还是由一些不完美之处。主要是由于在Java类大量的使用List泛型,J2as3并不支持这个转换,目前作者还在进行修改。
下面就是我对J2as3的代码进行一些修改,以方便在BlazeDs4环境中使用。
修改的代码位置是J2AS3Application.as的convertFile函数中,这个方法读取java类文件,并通过转换器将文件内容转换,然后再重新生成新的as类文件。
var converter:Converter = new Converter(code);
var as3Code:String =
converter.getNewClass();
其中的as3Code将为转换后的代码。在将as3Code生成类文件之前,进行我的处理。在此本人并不深入到converter内部去逐个处理,而是直接在as3Code上使用正则表达式来处理。本文是在Jaxb生成的imsqti_v2p1规范的java类转换成适用于BlazeDS与Flash间值对象映射的情景下练习用的,并未优化,也不考虑通用场景,切勿生搬硬套到别的场合。
1、List<type>的转换 。
默认情况下,对于无法识别的AS3语法之外的字符串,J2AS3会保留不动,BlazeDS的官方文档中描述到Java中的List类型在AS3中可以使用Array来映射。在Flex中,我使用mx.collections.ArrayCollection类来映射。
例如protected List<Serializable> content;要转换成:protected var content :ArrayCollection;
实现代码:
myPattern=/List<(\w+)>
(\w+);/g;
as3Code=as3Code.replace(myPattern,"var $2
:ArrayCollection;");
其中的myPattern为RegExp类。
()表示是使用组;这样可以在替换时使用$1,$2来引用匹配的串;
“组是模式的子部分。您可以使用组实现以下操作:
■ 将数量表示符应用到多个字符。
■ 界定要应用逻辑“或”(通过使用 |
字符)的子模式。
■ 捕获正则表达式中的子字符串匹配(例如,在正则表达式中使用 \1 以匹配先前匹配的
组,或类似地在 String 类的
replace() 方法中使用 $1)。”
\w用法:匹配单词字符(A-Z、a-z、0-9 或 _)
/g表现全局,对as3Code全串进行查找。“指定是否为正则表达式使用全局匹配。如果 global ==
true
,找到一个匹配项后将设置 lastIndex
属性。下次请求查找匹配项时,此正则表达式引擎将从字符串中的
lastIndex
位置开始查找。构造正则表达式时,使用 g
标志将 global
设置为true
。”
2、将protected改为public
之所以这样做是因为 Jaxb自动生成的imsqti_v2p1类的成员变量是protected的,然后通过get/set来实现读写,这对于与Flash端的序列化有影响,为了方便两者互操作,统统将成员变量变成public,
实现代码:
myPattern= /protected/gi;
as3Code=as3Code.replace(myPattern,"public");
3、在AS3中做valueObject的映射
要指定远程对象的别名,即如下形式:
[RemoteClass(alias="edu.lltang.jaxb.imsqti_v2p1.AbbrType")]
public class
AbbrType {
在做转换时,可以这样实现:
myPattern=/public class (\w+)
{/g;
as3Code=as3Code.replace(myPattern,"[Bindable]\n[RemoteClass(alias="edu.lltang.jaxb.imsqti_v2p1.$1")]\npublic
class $1 {");
4、枚举类型
关于AS中的枚举,AS3官方文档是这样描述的:
“枚举”是您创建的一些自定义数据类型,用于封装一小组值。ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 Enumeration 接口不一样。不过,您可以使用类或静态常量创建枚举。例如,ActionScript 3.0 中的 PrintJob 类使用名为 PrintJobOrientation 的枚举来存储由 "landscape" 和"portrait" 组成的一组值,如下面的代码所示:
public final class PrintJobOrientation { public static const LANDSCAPE:String = "landscape"; public static const PORTRAIT:String = "portrait"; }
按照惯例,枚举类是使用 final 属性声明的,因为不需要扩展该类。该类仅由静态成员组成,这表示不创建该类的实例。而是直接通过类对象来访问枚举值。
先看Java类:
public enum CardinalityType {
@XmlEnumValue("multiple")
MULTIPLE("multiple"),
@XmlEnumValue("ordered")
ORDERED("ordered"),
@XmlEnumValue("record")
RECORD("record"),
@XmlEnumValue("single")
SINGLE("single");
private final String value;
CardinalityType(String v)
{
value = v;
}
public String value()
{
return
value;
}
public static CardinalityType fromValue(String v)
{
for (CardinalityType c:
CardinalityType.values())
{
if
(c.value.equals(v))
{
return c;
}
}
throw new
IllegalArgumentException(v);
}
}
改变成:
public final class CardinalityType
{
public static const
MULTIPLE:String = "multiple";
public static const ORDERED:String =
"ordered";
public static const
RECORD:String = "record";
public
static const SINGLE:String = "single";
}
实现代码:(如下代码是根据Jaxb生成java类而改的,并未优化,切勿生搬硬套到别的场合。)
if(as3Code.indexOf("enum")!=-1)
{
as3Code="package
edu.lltang.qti.as3{\n"+as3Code+"}";
myPattern=/public enum (\w+)
{/g;
as3Code=as3Code.replace(myPattern,"public final class $1
{");
li=as3Code.indexOf("private",0);
as3Code=as3Code.substring(0,li);
as3Code+="}"
myPattern=/(\w+)\("(\w+)"\),/g;
as3Code=as3Code.replace(myPattern,"public static const $1:String =
"$2";");
myPattern=/(\w+)\("(\w+)"\);/g;
as3Code=as3Code.replace(myPattern,"public static const $1:String =
"$2";");
}else
{
5、Double
J2AS3在关键字列表(Tokenizer.as)中没有包含Double(有double),在进行查找时,虽然能匹配,但转换的时候,没有将Double转换成Number。
public var lowerBound:Double;
这样的转换会造成编译错误。
在Converter.as的toASType方法中,将:
if (type == "double" || type == "float"
)
return "Number";
改为:
if (type == "double" || type == "float" ||
type=="Double")
return "Number";
即可。
附:jaxb>Imsqti_v2p1.xsd->Java Class->AS3 Class,加在J2AS3项目的J2AS3Application类的convertFile方法末。
//lltang
var myPattern:RegExp = /
,/gi;
var
li:int=as3Code.indexOf("*/",0);
as3Code=as3Code.substring(li+2,as3Code.length);
li=as3Code.indexOf("/*",0);
as3Code=as3Code.substr(0,li);
as3Code+="}";
as3Code=as3Code.replace(myPattern,"");
as3Code=as3Code.replace("})","");
//如果是枚举类:
if(as3Code.indexOf("enum")!=-1)
{
as3Code="package
edu.lltang.qti.as3{\n"+as3Code+"}";
myPattern=/public enum (\w+)
{/g;
as3Code=as3Code.replace(myPattern,"public final class $1
{");
li=as3Code.indexOf("private",0);
as3Code=as3Code.substring(0,li);
as3Code+="}\n}";
myPattern=/(\w+)\("(\w+)"\),/g;
as3Code=as3Code.replace(myPattern,"public static const $1:String =
"$2";");
myPattern=/(\w+)\("(\w+)"\);/g;
as3Code=as3Code.replace(myPattern,"public static const $1:String =
"$2";");
}else
{
as3Code="package edu.lltang.qti.as3{\n import
mx.collections.ArrayCollection;\n"+as3Code+"}";
myPattern=
/protected/gi;
as3Code=as3Code.replace(myPattern,"public");
myPattern=/List<(\w+)> (\w+);/g; //demo:List<Serializable>
content->var content
:ArrayCollection
as3Code=as3Code.replace(myPattern,"var $2
:ArrayCollection;");
//添加映射类
myPattern=/public class (\w+)
{/g;
as3Code=as3Code.replace(myPattern,"[Bindable]\n[RemoteClass(alias="edu.lltang.jaxb.imsqti_v2p1.$1")]\npublic
class $1
{");
}
//trace(as3Code);
- J2AS3_v4.rar (523.8 KB)
- 下载次数: 41
发表评论
-
Flex4 背景声音Sound mp3 采样率的问题
2011-12-04 17:39 1212import flash.media.SoundChannel ... -
(转)使用embed标签绑定swf与参数传递
2011-10-08 12:26 1102原文网址:http://uh.9ria.com/space.p ... -
Flash代码执行原理与性能优化笔记
2011-08-06 10:25 1271flash和flex虽然都是基于as3的ide,但区别还是很大 ... -
Flex ArgumentError: Error #2015: 无效的 BitmapData
2011-04-26 18:30 4220在as3中调试bitmap调用bitmapdata对象的 ... -
flex 元数据标签的使用
2011-04-26 18:10 1181http://keren.iteye.com/blog/379 ... -
关于flex4.0回收(强制回收)
2011-04-26 12:56 1299adobe的内存回收机制确实不尽人意.特别是大数据量时内存回收 ... -
删除加载的swf
2011-04-21 18:16 903先要 removechild 然后再 unload然后尝试 c ... -
redtamarin 用as3开发命令行程序
2011-04-20 16:31 1962我们知道,在AS3编程中,无论我们有没有写代码,都会出来一个界 ... -
Flex XMLList Error #1086: appendChild 方法只能用于包含单一项目的列表
2011-03-29 10:59 1922Flex的 XMLList 对象,要对其添加xml,想到了用 ... -
flex(actionscript3.0)中E4x 和 XML的应用
2011-03-28 20:31 1891下面是对图灵出版的XML and E4X 的一些章节翻译,供参 ... -
Flex中控件的initialize和creationComplete和applicationComplete事件总结
2011-03-26 20:28 16941.Application标签中有三个事件 initiali ... -
Flex ,ActionScript 3.0 技巧和工具整理
2011-03-16 19:38 1353Cairngorm 迁移进入Adobe开源网站(Cairngo ... -
MinimalComps:轻型AS3 UI 组件库
2011-03-04 17:42 2175http://gray.topdrupal.com/Minim ... -
flex发送QQ表情
2011-03-04 17:24 958http://fykyx521.iteye.com/blog/ ... -
flex动态切换皮肤
2011-03-04 17:09 1285http://fykyx521.iteye.com/blog/ ... -
Flex4 自定义皮肤的使用方法
2011-03-04 17:06 1976skinClass的使用方法: 【1, 属性引用】 ... -
FLEX4样式
2011-03-04 17:02 1364http://blog.chinaunix.net/space ... -
AS3 库资源
2011-03-04 16:59 677http://www.flexstudio.cn/?p=24 ... -
30个基于Adobe AIR的网络应用
2011-03-04 16:56 687http://www.flexstudio.cn/?p=21 -
Flex中的布局
2011-03-04 16:52 941http://varnow.org/?p=131 首先说说F ...
相关推荐
### Java调用视频转换工具FFmpeg知识点归纳 #### 一、环境配置与文件准备 **1.1 FFmpeg工具的安装与配置** - **下载与安装:** - 首先,确保已经在本地计算机上安装了FFmpeg工具。可以在官方网站上下载适合...
4. **注意事项**: - 使用Jacob进行转换时,必须在运行Java程序的机器上安装与Word文档版本兼容的Microsoft Word。 - Jacob是Windows平台特有的,因此这个转换方案不适用于Linux或macOS。 - 转换可能丢失部分Word...
语言上其他方面的转换注意事项 - AS3取消了AS2中的某些过时的语言特性,如`_root`、`_parent`等。 - 强调面向对象编程的最佳实践,如继承和多态。 - 支持更现代的数据类型和操作符。 #### 第二章 可视元素...
#### 五、注意事项 1. **环境兼容性**: - 确保 Java 环境版本与 JACOB 兼容。 - 确认使用的 Word 版本与 JACOB 兼容。 2. **异常处理**: - 在转换过程中可能出现各种异常,如文件不存在或权限问题等。 3. **性能...
#### 五、注意事项 1. **环境配置**:确保安装了Microsoft Word,并且Jacob库正确配置在项目中。 2. **权限问题**:运行此Java程序时,可能需要管理员权限,特别是当涉及到文件系统操作时。 3. **异常处理**:代码...
语言上其他方面的转换注意事项** - AS3 引入了更严格的类型检查,开发者需要确保所有变量都有明确的类型声明。 - AS3 支持更多的面向对象特性,如接口和抽象类等,这些特性有助于构建更复杂的应用程序。 #### 三...
5. **注意事项** - Jacob 是基于 COM 的,因此只能在 Windows 系统上运行。 - Office 应用程序必须安装在系统上,Jacob 才能与之交互。 - 转换过程可能会受到 Office 版本的影响,不同版本可能支持的功能和行为...
7. **注意事项** - 需要用户许可才能访问摄像头和麦克风。 - 本地保存可能受到浏览器或操作系统权限的限制,确保用户有足够的权限。 - FLV编码可能需要对视频编解码原理有深入了解,或使用现有的开源库。 - 由于...
Java调用FFmpeg实现视频转换涉及到Java编程语言和FFmpeg多媒体处理工具的使用。FFmpeg是一个非常强大的命令行工具,支持几乎所有的视频文件格式转换。在Java中调用FFmpeg,通常使用Runtime或者ProcessBuilder类来...
总的来说,使用Java和JACOB库进行Office到PDF的转换,虽然有一些限制,但不失为一种可行的解决方案,尤其适用于那些需要在Java环境中集成Office功能的应用。在实际开发中,还应考虑其他替代方案,如Apache POI、...
AS+Smalidea是一款针对Android应用的动态调试工具包,专为逆向工程爱好者和安全研究人员设计。在本文中,我们将深入探讨这个工具包的功能、使用方法以及它如何帮助我们理解并分析Android应用的内部机制。 一、...
#### 五、注意事项与优化建议 - **类型匹配**:确保Java对象属性与数据库对象字段类型完全匹配,避免类型转换错误。 - **性能考量**:对于大量数据的集合参数传递,考虑使用批量加载策略,以减少网络传输开销和提高...
8. **注意事项** - 记得在`AndroidManifest.xml`中添加必要的权限,如读取存储权限,以便访问本地文件。 - 不同的Android设备可能需要不同架构的库,因此在添加abiFilters时要包含所有可能的架构。 - 确保使用与...
4. **注意事项** - 转换过程中可能会遇到权限问题,确保Java和Word具有足够的权限执行操作。 - 由于JACOB依赖于COM组件,所以这种方法只适用于Windows操作系统。 - 转换可能不保留所有Word文档的格式和样式,因为...
在" douglascrockford-JSON-java-dced076 "这个压缩包中,可能包含了Douglas Crockford,JSON的创始人之一,对于JSON在Java环境下的实现和使用的一些示例或工具。 1. **JSON的基本结构:** JSON数据以键值对的形式...
Java语音API的文档中提到了其许可证和商标信息,以及对于该API使用的一些限制和注意事项。文档中声明了该API可能受专利保护,还声明了开发者在使用该API时所获得的是一份非独家、非可转让、永久的世界范围内有限的...
四、注意事项 1. 数据类型:Excel支持多种数据类型,如日期、时间、数字等,转换时需注意保持数据的准确性,如日期可能需要特别处理。 2. 多工作表:一个Excel文件可能包含多个工作表,转换时每个工作表可能需要...