在Flex 开发过程中,经常遇到 java 对象转化为 Flex 对象的情形,手动编码,费时费力,枯燥无味,并且经常出现拼写错误,可谓事倍功半。所以就自己写了个自动生成类,发布在这里,请大家拍砖交流。呵呵。
为了开发简单,它遵循以下规则:
- Flex的包名和要转化的 java 类包名一直
- Flex的类名和要转化的 java 类名一直
使用:
- 在as.properties 文件(和GeneratorASFromJava在同一目录下)配置 Flex 文件的输出目录,只有一个属性。例如
outDir= d : /as
- 调用 GeneratorASFromJava ,传入参数:java.util.List<class> 。使用示例:
public static void main(String[] s) {
List<Class> l =new java.util.ArrayList<Class>();
l.add(SecuUser.class);
l.add(SecuRole.class);
l.add(SecuResource.class);
GeneratorASFromJava g = new GeneratorASFromJava(l);
g.generate();
}
源文件解析:
AsObj.java:
根据java class 并参考 AsDataTypesUtils 返 回对应Flex 类源码,就是一串文本。
注意:
取java类的所有属性时,记得将Object的属性排除掉。
BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class );//意思是不分析clazz的父类Object
否则生成的Flex类会有下面这个属性:
public var class:java.lang.Class;
GeneratorASFromJava :
调用 AsObj生成 Flex 类并输出到 as.properties 配置的目录中,并打开这个目录。
附上源代码
AsObj :
package cn.com.zdg.flex.util;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map;
public class AsObj {
private String asPackageName;
private String asClassName;
private static String Field_Des = "public var ";
private Map<String, String> map;
private static String Blank = " ";
static String Enter = "\r";
private static String Tab = "\t";
private static String BraceFirstEnter = "{" + Enter;
private static String BraceLastEnter = "}" + Enter;
private static String BraceLast = "}";
public AsObj(Class clazz) {
this.asClassName = clazz.getSimpleName();
this.asPackageName = clazz.getPackage().getName();
this.map = getFieldMap(clazz);
}
public AsObj(String asPackageName, String asClassName,
Map<String, String> map) {
this.asPackageName = asPackageName;
this.asClassName = asClassName;
this.map = map;
}
public String getAsPackageName() {
return asPackageName;
}
public void setAsPackageName(String asPackageName) {
this.asPackageName = asPackageName;
}
public String getAsClassName() {
return asClassName;
}
public void setAsClassName(String asClassName) {
this.asClassName = asClassName;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public String getAsObjString() {
StringBuilder sb = new StringBuilder();
// package
sb.append("package ").append(this.asPackageName)
.append(BraceFirstEnter);
// Biandable
sb.append(Tab).append("[Bindable]").append(Enter);
//Remo
sb.append(Tab).append("[RemoteClass(alias=\"").append(this.asPackageName).append(".").append(this.asClassName).append("\")]").append(Enter);
// class
sb.append(Tab).append("public class ").append(this.asClassName).append(
BraceFirstEnter);
// fields
for (Map.Entry<String, String> entry : map.entrySet()) {
sb.append(Tab).append(Tab).append(Field_Des).append(entry.getKey())
.append(":").append(entry.getValue()).append(";").append(
Enter);
}
// constructor
sb.append(Tab).append(Tab).append("public function ").append(
this.asClassName).append("()").append(BraceFirstEnter).append(
Enter).append(Tab).append(Tab).append(BraceLastEnter);
// Brace last
sb.append(Tab).append(BraceLastEnter);
sb.append(BraceLast);
return sb.toString();
}
public static void main(String[] ar) {
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < 10; i++) {
map.put("F1" + i, "Type" + i);
}
AsObj as = new AsObj("cn.com.zdg.as", "BruceTest", map);
System.out.println(as.getAsObjString());
}
private Map<String, String> getFieldMap(Class clazz) {
Map<String, String> map = new HashMap<String, String>();
try {
BeanInfo beanInfo = Introspector.getBeanInfo(clazz,Object.class);
PropertyDescriptor[] pro = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor p : pro) {
// if (p.getName().equals("class")) {
// continue;
//
// }
map.put(p.getName(),AsDataTypesUtils.getPreferredAsType( p.getPropertyType().getName()));
}
// for (int i = 0; i < pro.length; i++) {
// PropertyDescriptor p = pro[i];
// System.out.println("Name: " + p.getName() + " , type: "
// + p.getPropertyType().getName());
//
// }
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map;
}
}
GeneratorASFromJava :
package cn.com.zdg.flex.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.net.URL;
import java.util.List;
import java.util.Properties;
import cn.com.zdg.entity.security.SecuResource;
import cn.com.zdg.entity.security.SecuRole;
import cn.com.zdg.entity.security.SecuUser;
public class GeneratorASFromJava {
private List<Class> javaclassList;
private File destdir;
private String baseDir;
// public GeneratorASFromJava(Class) {
//
// }
public GeneratorASFromJava() {
}
public GeneratorASFromJava(List<Class> javaclassList) {
this.javaclassList = javaclassList;
if (this.javaclassList==null||this.javaclassList.size()==0) {
throw new IllegalStateException("Convert Class can not be null");
}
baseDir = this.getBaseDir();
}
private String getBaseDir() {
String baseDir = null;
InputStream input = null;
try {
String packageName = this.getClass().getPackage().getName();
packageName = packageName.replace(".", File.separator);
URL url = GeneratorASFromJava.class.getClassLoader().getResource(
packageName + File.separator + "as.properties");
Properties p = new Properties();
input = url.openStream();
p.load(input);
baseDir = p.get("outDir").toString();
File f = new File(baseDir);
if (!f.exists()) {
f.mkdirs();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return baseDir;
}
public void generate() {
Writer writer = null;
try {
for (Class javaclass : javaclassList) {
AsObj as = new AsObj(javaclass);
File f = new File(getDestFile(javaclass), javaclass
.getSimpleName()
+ ".as");
writer = new FileWriter(f);
writer.write(as.getAsObjString());
writer.flush();
}
Runtime.getRuntime().exec("cmd.exe /c start " + baseDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private File getDestFile(Class javaclass) {
String dir = javaclass.getPackage().getName().replace(".",
File.separator);
File f = new File(baseDir, dir);
if (!f.exists()) {
f.mkdirs();
}
return f;
}
public static void main(String[] s) {
List<Class> l =new java.util.ArrayList<Class>();
l.add(SecuUser.class);
l.add(SecuRole.class);
l.add(SecuResource.class);
GeneratorASFromJava g = new GeneratorASFromJava(l);
g.generate();
}
}
AsDataTypesUtils
package cn.com.zdg.flex.util;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 描述java类型和as类型对应关系
*
*/
public class AsDataTypesUtils {
private final static Map<String, String> preferredAsTypeForJavaType = new HashMap<String, String>();
public static String getPreferredAsType(String javaType) {
String result = preferredAsTypeForJavaType.get(javaType);
if (result == null) {
result = javaType;
}
return result;
}
static {
preferredAsTypeForJavaType.put("java.lang.Short", "Number");
preferredAsTypeForJavaType.put("short", "Number");
preferredAsTypeForJavaType.put("java.lang.Integer", "Number");
preferredAsTypeForJavaType.put("int", "Number");
preferredAsTypeForJavaType.put("java.lang.Long", "Number");
preferredAsTypeForJavaType.put("long", "Number");
preferredAsTypeForJavaType.put("java.lang.Float", "Number");
preferredAsTypeForJavaType.put("float", "Number");
preferredAsTypeForJavaType.put("java.lang.Double", "Number");
preferredAsTypeForJavaType.put("float", "Number");
preferredAsTypeForJavaType.put("java.math.BigDecimal", "Number");
preferredAsTypeForJavaType.put("java.lang.Byte", "Number");
preferredAsTypeForJavaType.put("byte", "Number");
preferredAsTypeForJavaType.put("java.lang.Boolean", "Boolean");
preferredAsTypeForJavaType.put("boolen", "Boolean");
preferredAsTypeForJavaType.put(boolean.class.getName(), "Boolean");
preferredAsTypeForJavaType.put("char", "String");
preferredAsTypeForJavaType.put("char[]", "String");
preferredAsTypeForJavaType.put("java.lang.String", "String");
preferredAsTypeForJavaType.put("java.sql.Clob", "String");
preferredAsTypeForJavaType.put("byte[]", "flash.utils.ByteArray");
preferredAsTypeForJavaType.put("java.sql.Blob", "flash.utils.ByteArray");
preferredAsTypeForJavaType.put("java.sql.Array", "Array");
preferredAsTypeForJavaType.put("java.lang.reflect.Array", "Array");
preferredAsTypeForJavaType.put("java.util.Collection", "mx.collections.ArrayCollection");
preferredAsTypeForJavaType.put("java.util.List", "mx.collections.ArrayCollection");
preferredAsTypeForJavaType.put("java.util.ArrayList", "mx.collections.ArrayCollection");
preferredAsTypeForJavaType.put("java.util.ArrayList", "mx.collections.ArrayCollection");
preferredAsTypeForJavaType.put("java.util.Set", "Object");
preferredAsTypeForJavaType.put("java.util.HashSet", "Object");
preferredAsTypeForJavaType.put("java.util.Map", "Object");
preferredAsTypeForJavaType.put("java.util.HashMap", "Object");
preferredAsTypeForJavaType.put("java.sql.Date", "Date");
preferredAsTypeForJavaType.put("java.sql.Time", "Date");
preferredAsTypeForJavaType.put("java.util.Date", "Date");
preferredAsTypeForJavaType.put("java.sql.Timestamp", "Date");
}
public static void main(String[] args) {
String bb = AsDataTypesUtils.getPreferredAsType(List.class.getName());
System.out.println(bb);
}
}