Java2AS3
javaのトランスファオブジェクト から ActionScript 3.0 を生成するソースコードトランスレータです。
ポイントはAS3ってところ。
これで正しく動くかは・・・もう少々お待ちを。
Java2AS3.java version0.0.1
package flexcoder.java2as3; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Field; import java.util.Date; import java.util.HashMap; /** * flexcoder.java2as3.Java2AS3 * * @author sato-shi * @version 0.0.1 * @description JavaのVOからASのVOを自動で生成する */ public class Java2AS3 { public static void main(String args[]) { if (args.length == 1) { generateAS(args[0]); } else { System.out.println("Invalid list of arguments"); System.out.println("Usage: java Java2AS3 classname"); } } public static HashMap generateAS(String javaClass) { StringBuffer asSource = new StringBuffer(); StringBuffer messages = new StringBuffer(); BufferedWriter out = null; try { Class clazz = Class.forName(javaClass); String className = clazz.getName(); if (!(clazz.newInstance() instanceof java.io.Serializable)) { messages.append("WARNING: Class " + className + " does not implement java.io.Serializable\n"); } int lastDot = className.lastIndexOf("."); String shortClassName = lastDot < 0 ? className : className .substring(lastDot + 1); Package packageClass = clazz.getPackage(); String propertyName = null; // コメント asSource.append("/**\n"); asSource.append(" * クラス名 : " + className + "\n"); asSource.append(" * 作成日時 : " + new Date() + "\n"); asSource.append(" */\n"); // パッケージ名の宣言 asSource.append("package " + packageClass.getName() + " {\n"); asSource.append("\n\t[Managed]\n"); asSource.append("\t[RemoteClass(alias=\"" + className + "\")]\n"); // クラス名の宣言 asSource.append("\tpublic class " + shortClassName + " {\n\n"); // フィールド名の宣言 Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; propertyName = field.getName(); if (!propertyName.equals("class")) { asSource.append("\t\tpublic var " + propertyName + " : " + getASType(field.getType()) + ";\n"); } } // コンストラクタの宣言(実装予定) // メソッドの宣言(実装予定) // クラスを閉じる asSource.append("\n\t}"); // パッケージを閉じる asSource.append("\n}"); System.out.println(asSource); out = new BufferedWriter(new FileWriter(shortClassName + ".as")); out.write(asSource.toString()); messages .append(shortClassName + ".as successfully written to disk"); } catch (ClassNotFoundException e) { messages.append("ERROR: Class " + javaClass + " not found"); } catch (InstantiationException e) { messages.append("ERROR: Class " + javaClass + " must have a no-argument constructor"); } catch (IllegalAccessException e) { messages.append(e.getMessage()); } catch (IOException e) { messages.append(e.getMessage()); } finally { try { if (out != null) out.close(); } catch (IOException e) { } } HashMap map = new HashMap(); map.put("source", asSource.toString()); map.put("messages", messages.toString()); return map; } public static String getASType(Class type) { String typeName = type.getName(); System.out.println(typeName); if (typeName.equals("java.lang.String")) { return "String"; } else if (typeName.equals("int") || typeName.equals("short") || typeName.equals("byte")) { return "int"; } else if (typeName.equals("long")) { return "uint"; } else if (typeName.equals("double") || typeName.equals("float") || typeName.equals("java.lang.Integer") || typeName.equals("java.lang.Long") || typeName.equals("java.lang.Short") || typeName.equals("java.lang.Double") || typeName.equals("java.lang.Float") || typeName.equals("java.lang.Byte")) { return "Number"; } else if (typeName.equals("boolean") || typeName.equals("java.lang.Boolean")) { return "Boolean"; } else if (typeName.equals("java.util.ArrayList") || typeName.equals("java.util.List")) { return "Array"; } else if (typeName.equals("java.util.Date")) { return "Date"; } else if (typeName.equals("org.w3c.dom.Document")) { return "XML"; } else { return "Object"; } } }
例です。
これが、
package flexcoder.java2as3.sample; import java.util.Date; import java.util.List; public class Person { public String name; public String address; public int age; public Date birthDay; public List memory; }
こうなります。
/** * クラス名 : flexcoder.java2as3.sample.Person * 作成日時 : Mon Feb 13 14:34:17 JST 2006 */ package flexcoder.java2as3.sample { [Managed] [RemoteClass(alias="flexcoder.java2as3.sample.Person")] public class Person { public var name : String; public var address : String; public var age : int; public var birthDay : Date; public var memory : Array; } }
思い出が配列・・・。
参考資料
Java2AS: Automatically generating ActionScript classes based on Java Value Objects