java对象自动生成Flex对象

    在Flex 开发过程中,经常遇到 java 对象转化为 Flex 对象的情形,手动编码,费时费力,枯燥无味,并且经常出现拼写错误,可谓事倍功半。所以就自己写了个自动生成类,发布在这里,请大家拍砖交流。呵呵。

 

 

为了开发简单,它遵循以下规则:

  •   Flex的包名和要转化的 java 类包名一直
  •   Flex的类名和要转化的 java 类名一直

使用:
  1. 在as.properties 文件(和GeneratorASFromJava在同一目录下)配置 Flex 文件的输出目录,只有一个属性。例如

outDir= d : /as

 

  1. 调用 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);
		
	}

}
 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值