Java转Delphi的工具类              

原文:http://blog.csdn.net/xiakan008/article/details/7327491

最近有个项目需要用到Java中间层和Delphi客户端,中间层和客户端之间的交互用JSON;

大家都知道Java世界里存在着各种各样的实体类,而Delphi端也需要这些实体类的代码,当然通过JNI也是可以访问JAVA代码的,但是这样无疑会带来项目复杂度,因此写了这么个转换工具类。

调用方法:ClassUtil.TransforEntiyToDelphi( ClassUtil.getModelClasses("com.nbport") );

com.nbport是包名,其会扫描包下所有被标记为@Entity的类

1.实现了Java实体类转为Delphi实体类的功能

2.实现了由SuperObject直接映射成为Delphi实体类的功能;

代码很垃圾。。。有空再重构下

  1. package com.nbport.ctos.framework.util;  
  2.   
  3. import java.beans.PropertyDescriptor;  
  4. import java.io.BufferedWriter;  
  5. import java.io.File;  
  6. import java.io.FileFilter;  
  7. import java.io.FileOutputStream;  
  8. import java.io.IOException;  
  9. import java.io.OutputStreamWriter;  
  10. import java.lang.reflect.Method;  
  11. import java.lang.reflect.ParameterizedType;  
  12. import java.net.JarURLConnection;  
  13. import java.net.URL;  
  14. import java.net.URLDecoder;  
  15. import java.util.Enumeration;  
  16. import java.util.Hashtable;  
  17. import java.util.LinkedHashSet;  
  18. import java.util.Map;  
  19. import java.util.Set;  
  20. import java.util.jar.JarEntry;  
  21. import java.util.jar.JarFile;  
  22.   
  23. import javax.persistence.Entity;  
  24.   
  25. import org.springframework.beans.BeanWrapper;  
  26. import org.springframework.beans.BeanWrapperImpl;  
  27.   
  28. public class ClassUtil {  
  29.   
  30.     private static Hashtable< Class<?>,Integer > useEntiy = new Hashtable< Class<?>,Integer >();  
  31.       
  32.     private static final String NEWLINE = "\r\n";  
  33.       
  34.     public static void TransforEntiyToDelphi(Set<Class<?>> set)  
  35.             throws IOException, InstantiationException, IllegalAccessException {  
  36.         for (Class<?> c : set) {  
  37.             useEntiy.clear();  
  38.             String className = GetDClassName(c);  
  39.             File file = new File(GetDUintName(c)+".pas");  
  40.             BufferedWriter out = new BufferedWriter(new OutputStreamWriter(  
  41.                     new FileOutputStream(file)));  
  42.             BeanWrapper bw = new BeanWrapperImpl(c.newInstance());  
  43.             PropertyDescriptor[] pds = bw.getPropertyDescriptors();  
  44.             StringBuffer privateFieldString = new StringBuffer();  
  45.             StringBuffer publicFieldString = new StringBuffer();  
  46.             StringBuffer propertyString = new StringBuffer();  
  47.             StringBuffer methodImpString = new StringBuffer();  
  48.             StringBuffer createFromJson = new StringBuffer();  
  49.             StringBuffer destroyString = new StringBuffer();   
  50.             publicFieldString.append("\t")  
  51.                     .append("constructor Create; overload;").append(NEWLINE);  
  52.             publicFieldString  
  53.                     .append("\t")  
  54.                     .append("constructor Create(obj : ISuperObject); overload;")  
  55.                     .append(NEWLINE);  
  56.             publicFieldString  
  57.                     .append("\t")  
  58.                     .append("destructor Destroy; overload;")  
  59.                     .append(NEWLINE);  
  60.               
  61.             publicFieldString.append("\t")  
  62.                     .append("procedure CreateFromJSON(obj : ISuperObject);")  
  63.                     .append(NEWLINE);  
  64.               
  65.             methodImpString.append("constructor ").append(className)  
  66.                     .append(".").append("Create").append(";").append(NEWLINE);  
  67.             methodImpString.append("begin").append(NEWLINE).append("\t")  
  68.                     .append("inherited Create;").append(NEWLINE).append("end;")  
  69.                     .append(NEWLINE);  
  70.               
  71.             methodImpString.append("constructor ").append(className)  
  72.                     .append(".").append("Create(obj : ISuperObject);").append(NEWLINE);  
  73.             methodImpString.append("begin").append(NEWLINE).append("\t")  
  74.                     .append("inherited Create;").append(NEWLINE).append("\t")  
  75.                     .append("CreateFromJSON(obj);").append(NEWLINE)  
  76.                     .append("end;").append(NEWLINE);  
  77.               
  78.             methodImpString.append(GetDestoryString(destroyString, c));  
  79.               
  80.             createFromJson  
  81.                     .append("procedure ").append(className).append(".")  
  82.                     .append("CreateFromJSON(obj : ISuperObject);").append(NEWLINE);  
  83.             if(IsNeedVarArray(c)){  
  84.                 createFromJson.append("var").append(NEWLINE).append("i : Integer;").append(NEWLINE)  
  85.                     .append("jsonArray : TSuperArray;").append(NEWLINE);  
  86.             }  
  87.             createFromJson.append("begin").append(NEWLINE);  
  88.             for (PropertyDescriptor pd : pds) {  
  89.                 Method readMethod = pd.getReadMethod();  
  90.                 Method writeMethod = pd.getWriteMethod();  
  91.                 if (readMethod != null && writeMethod != null) {  
  92.                     String fieldName = pd.getDisplayName();  
  93.                     String fixedName = "F"  
  94.                             + fieldName.substring(0, 1).toUpperCase()  
  95.                             + fieldName.substring(1);  
  96.                     privateFieldString.append("\t").append(fixedName)  
  97.                             .append(" : ")  
  98.                             .append(JToD(pd.getPropertyType(),readMethod))  
  99.                             .append(";").append(NEWLINE);  
  100.   
  101.                     publicFieldString  
  102.                             .append("\t")  
  103.                             .append("procedure " + writeMethod.getName())  
  104.                             .append("(")  
  105.                             .append("const Value : "  
  106.                                     + JToD(writeMethod  
  107.                                             .getParameterTypes()[0],readMethod))  
  108.                             .append(")").append(";").append(NEWLINE);  
  109.   
  110.                     publicFieldString.append("\t")  
  111.                             .append("function " + readMethod.getName())  
  112.                             .append("() : ").append(JToD(readMethod.getReturnType(),readMethod))  
  113.                             .append(";").append(NEWLINE);  
  114.   
  115.                     propertyString.append("\t").append("property ")  
  116.                             .append(fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1)).append(" : ")  
  117.                             .append(JToD(pd.getPropertyType(),readMethod))  
  118.                             .append(" read ").append(readMethod.getName())  
  119.                             .append(" write ").append(writeMethod.getName())  
  120.                             .append(";").append(NEWLINE);  
  121.   
  122.                     methodImpString  
  123.                             .append("procedure ")  
  124.                             .append(className)  
  125.                             .append(".")  
  126.                             .append(writeMethod.getName())  
  127.                             .append("(")  
  128.                             .append("const Value : "  
  129.                                     + JToD(writeMethod  
  130.                                             .getParameterTypes()[0],readMethod))  
  131.                             .append(")").append(";").append(NEWLINE);  
  132.   
  133.                     methodImpString.append("begin").append(NEWLINE).append("\t")  
  134.                             .append(fixedName).append(" := Value;")  
  135.                             .append(NEWLINE).append("end;").append(NEWLINE);  
  136.   
  137.                     methodImpString.append("function ").append(className)  
  138.                             .append(".").append(readMethod.getName())  
  139.                             .append("() : ").append(JToD(readMethod.getReturnType(),readMethod))  
  140.                             .append(";").append(NEWLINE);  
  141.   
  142.                     methodImpString.append("begin").append(NEWLINE).append("\t")  
  143.                             .append("Result := ").append(fixedName).append(";")  
  144.                             .append(NEWLINE).append("end;").append(NEWLINE);  
  145.                       
  146.                     GetJsonConvertString(createFromJson,fieldName,fixedName,pd);  
  147.                 }  
  148.             }  
  149.             out.write("unit "+GetDUintName(c)+";");  
  150.             out.newLine();  
  151.             out.write("interface");  
  152.             out.newLine();  
  153.             out.write("uses");  
  154.             out.newLine();  
  155.             StringBuffer useUnit = new StringBuffer();  
  156.             for (Map.Entry<Class<?>,Integer> entry:useEntiy.entrySet()) {  
  157.                 String unitName = GetDUintName(entry.getKey());  
  158.                 if (unitName.compareToIgnoreCase(GetDUintName(c))!=0) {  
  159.                     useUnit.append(unitName).append(",");  
  160.                 }  
  161.             }  
  162.             out.write(useUnit.length()==0?"\tClasses,SysUtils,Contnrs,SuperObject;"  
  163.                     :"\tClasses,SysUtils,Contnrs,SuperObject,"+useUnit.substring(0,useUnit.length()-1)+";");  
  164.             out.newLine();  
  165.             String typeDefine = GetTypeDefine(c);  
  166.             out.write(typeDefine.length()==0?"":"\ttype"+NEWLINE+typeDefine);  
  167.             out.newLine();  
  168.             out.write("\ttype");  
  169.             out.newLine();  
  170.             out.write("\t\t" + className + " = class(TObject)");  
  171.             out.newLine();  
  172.             out.write("private");  
  173.             out.newLine();  
  174.             out.write(privateFieldString.toString());  
  175.             out.newLine();  
  176.             out.write("public");  
  177.             out.newLine();  
  178.             out.write(publicFieldString.toString());  
  179.             out.newLine();  
  180.             out.write(propertyString.toString());  
  181.             out.newLine();  
  182.             out.write("end;");  
  183.             out.newLine();  
  184.             out.write("implementation");  
  185.             out.newLine();  
  186.             out.write(methodImpString.toString());  
  187.             out.write(createFromJson.append("end;").append(NEWLINE).toString());  
  188.             out.newLine();  
  189.             out.write("end.");  
  190.             out.newLine();  
  191.             out.flush();  
  192.             out.close();  
  193.         }  
  194.     }  
  195.   
  196.     private static boolean IsNeedVarArray(Class<?> c) throws InstantiationException, IllegalAccessException {  
  197.         BeanWrapper bw = new BeanWrapperImpl(c.newInstance());  
  198.         PropertyDescriptor[] pds = bw.getPropertyDescriptors();  
  199.         for (PropertyDescriptor pd:pds) {  
  200.             if(pd.getPropertyType().getSimpleName().compareToIgnoreCase("list")==0){  
  201.                 Class<?> jClass = GetGenericTypeByGetMethod(pd.getReadMethod());  
  202.                 if (IsEntiyClass(jClass)) {  
  203.                     return true;  
  204.                 }  
  205.             }  
  206.         }  
  207.         return false;  
  208.     }  
  209.   
  210.     private static String GetTypeDefine(Class<?> c) throws InstantiationException, IllegalAccessException {  
  211.         BeanWrapper bw = new BeanWrapperImpl(c.newInstance());  
  212.         PropertyDescriptor[] pds = bw.getPropertyDescriptors();  
  213.         StringBuffer sb = new StringBuffer();  
  214.         for (PropertyDescriptor pd:pds) {  
  215.             if(pd.getPropertyType().getSimpleName().compareToIgnoreCase("list")==0){  
  216.                 Class<?> jClass = GetGenericTypeByGetMethod(pd.getReadMethod());  
  217.                 if (IsEntiyClass(jClass)) {  
  218.                     sb.append("\t\t").append(GetDClassName(jClass)).append("Array = Array of ").append(GetDClassName(jClass)).append(";");  
  219.                 }else {  
  220.                     sb.append("\t\t").append(JToDBasic(jClass)).append("Array = Array of ").append(JToDBasic(jClass)).append(";");  
  221.                 }  
  222.             }  
  223.         }  
  224.         return sb.toString();  
  225.     }  
  226.   
  227.     public static Set<Class<?>> getModelClasses(String pack) {  
  228.         Set<Class<?>> set = getClasses(pack);  
  229.         Set<Class<?>> newSet = new LinkedHashSet<Class<?>>();  
  230.         for (Class<?> c : set) {  
  231.             if (IsEntiyClass(c)) {  
  232.                 newSet.add(c);  
  233.             }  
  234.         }  
  235.         return newSet;  
  236.     }  
  237.       
  238.     public static Set<Class<?>> getClasses(String pack) {  
  239.         // 第一个class类的集合  
  240.         Set<Class<?>> classes = new LinkedHashSet<Class<?>>();  
  241.         // 是否循环迭代  
  242.         boolean recursive = true;  
  243.         // 获取包的名字 并进行替换  
  244.         String packageName = pack;  
  245.         String packageDirName = packageName.replace('.', '/');  
  246.         // 定义一个枚举的集合 并进行循环来处理这个目录下的things  
  247.         Enumeration<URL> dirs;  
  248.         try {  
  249.             dirs = Thread.currentThread().getContextClassLoader()  
  250.                     .getResources(packageDirName);  
  251.             // 循环迭代下去  
  252.             while (dirs.hasMoreElements()) {  
  253.                 // 获取下一个元素  
  254.                 URL url = dirs.nextElement();  
  255.                 // 得到协议的名称  
  256.                 String protocol = url.getProtocol();  
  257.                 // 如果是以文件的形式保存在服务器上  
  258.                 if ("file".equals(protocol)) {  
  259.                     // 获取包的物理路径  
  260.                     String filePath = URLDecoder.decode(url.getFile(), "UTF-8");  
  261.                     // 以文件的方式扫描整个包下的文件 并添加到集合中  
  262.                     findAndAddClassesInPackageByFile(packageName, filePath,  
  263.                             recursive, classes);  
  264.                 } else if ("jar".equals(protocol)) {  
  265.                     // 如果是jar包文件  
  266.                     // 定义一个JarFile  
  267.                     JarFile jar;  
  268.                     try {  
  269.                         // 获取jar  
  270.                         jar = ((JarURLConnection) url.openConnection())  
  271.                                 .getJarFile();  
  272.                         // 从此jar包 得到一个枚举类  
  273.                         Enumeration<JarEntry> entries = jar.entries();  
  274.                         // 同样的进行循环迭代  
  275.                         while (entries.hasMoreElements()) {  
  276.                             // 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件  
  277.                             JarEntry entry = entries.nextElement();  
  278.                             String name = entry.getName();  
  279.                             // 如果是以/开头的  
  280.                             if (name.charAt(0) == '/') {  
  281.                                 // 获取后面的字符串  
  282.                                 name = name.substring(1);  
  283.                             }  
  284.                             // 如果前半部分和定义的包名相同  
  285.                             if (name.startsWith(packageDirName)) {  
  286.                                 int idx = name.lastIndexOf('/');  
  287.                                 // 如果以"/"结尾 是一个包  
  288.                                 if (idx != -1) {  
  289.                                     // 获取包名 把"/"替换成"."  
  290.                                     packageName = name.substring(0, idx)  
  291.                                             .replace('/', '.');  
  292.                                 }  
  293.                                 // 如果可以迭代下去 并且是一个包  
  294.                                 if ((idx != -1) || recursive) {  
  295.                                     // 如果是一个.class文件 而且不是目录  
  296.                                     if (name.endsWith(".class")  
  297.                                             && !entry.isDirectory()) {  
  298.                                         // 去掉后面的".class" 获取真正的类名  
  299.                                         String className = name.substring(  
  300.                                                 packageName.length() + 1,  
  301.                                                 name.length() - 6);  
  302.                                         try {  
  303.                                             // 添加到classes  
  304.                                             classes.add(Class  
  305.                                                     .forName(packageName + '.'  
  306.                                                             + className));  
  307.                                         } catch (ClassNotFoundException e) {  
  308.   
  309.                                         }  
  310.                                     }  
  311.                                 }  
  312.                             }  
  313.                         }  
  314.                     } catch (IOException e) {  
  315.                         // log.error("在扫描用户定义视图时从jar包获取文件出错");  
  316.                         e.printStackTrace();  
  317.                     }  
  318.                 }  
  319.             }  
  320.         } catch (IOException e) {  
  321.             e.printStackTrace();  
  322.         }  
  323.         return classes;  
  324.     }  
  325.   
  326.     public static void findAndAddClassesInPackageByFile(String packageName,  
  327.             String packagePath, final boolean recursive, Set<Class<?>> classes) {  
  328.         // 获取此包的目录 建立一个File  
  329.         File dir = new File(packagePath);  
  330.         // 如果不存在或者 也不是目录就直接返回  
  331.         if (!dir.exists() || !dir.isDirectory()) {  
  332.             // log.warn("用户定义包名 " + packageName + " 下没有任何文件");  
  333.             return;  
  334.         }  
  335.         // 如果存在 就获取包下的所有文件 包括目录  
  336.         File[] dirfiles = dir.listFiles(new FileFilter() {  
  337.             // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)  
  338.             public boolean accept(File file) {  
  339.                 return (recursive && file.isDirectory())  
  340.                         || (file.getName().endsWith(".class"));  
  341.             }  
  342.         });  
  343.         // 循环所有文件  
  344.         for (File file : dirfiles) {  
  345.             // 如果是目录 则继续扫描  
  346.             if (file.isDirectory()) {  
  347.                 findAndAddClassesInPackageByFile(  
  348.                         packageName + "." + file.getName(),  
  349.                         file.getAbsolutePath(), recursive, classes);  
  350.             } else {  
  351.                 // 如果是java类文件 去掉后面的.class 只留下类名  
  352.                 String className = file.getName().substring(0,  
  353.                         file.getName().length() - 6);  
  354.                 try {  
  355.                     classes.add(Thread.currentThread().getContextClassLoader()  
  356.                             .loadClass(packageName + '.' + className));  
  357.                 } catch (ClassNotFoundException e) {  
  358.   
  359.                 }  
  360.             }  
  361.         }  
  362.     }  
  363.       
  364.     private static String GetDestoryString(StringBuffer sb,Class<?> jClass) throws InstantiationException, IllegalAccessException {  
  365.         BeanWrapper bw = new BeanWrapperImpl(jClass.newInstance());  
  366.         PropertyDescriptor[] pds = bw.getPropertyDescriptors();  
  367.         sb.append("destructor ").append(GetDClassName(jClass)).append(".Destroy;").append(NEWLINE);  
  368.         sb.append("var i:Integer;").append(NEWLINE);  
  369.         sb.append("begin").append(NEWLINE);  
  370.         sb.append("\t").append("inherited Destroy;").append(NEWLINE);  
  371.         for (PropertyDescriptor pd:pds) {  
  372.             Class<?> c = pd.getPropertyType();  
  373.             String fieldName = pd.getDisplayName();  
  374.             String fixedName = "F"  
  375.                     + fieldName.substring(0, 1).toUpperCase()  
  376.                     + fieldName.substring(1);  
  377.             if (c.getSimpleName().compareToIgnoreCase("list") == 0) {  
  378.                 Class<?> gClass = GetGenericTypeByGetMethod(pd.getReadMethod());  
  379.                 if (IsEntiyClass(gClass)) {  
  380.                     sb.append("\t").append("for i:=0 to Length("+fixedName+")-1 do").append(NEWLINE);  
  381.                     sb.append("\tbegin").append(NEWLINE);  
  382.                     sb.append("\t\t").append(fixedName).append("[i].").append("Destroy;").append(NEWLINE);  
  383.                     sb.append("\tend;").append(NEWLINE);  
  384.                 }  
  385.             }else{  
  386.                 if(IsEntiyClass(c)){  
  387.                     sb.append("\t").append(fixedName).append(".Destroy;").append(NEWLINE);  
  388.                 }  
  389.             }  
  390.         }  
  391.         return sb.append("end;").append(NEWLINE).toString();  
  392.     }  
  393.       
  394.     private static String JToDBasic(Class<?> jClass) {  
  395.         if (jClass==null) {  
  396.             return "TObject";  
  397.         }  
  398.         if (IsEntiyClass(jClass)) {  
  399.             useEntiy.put(jClass, 1);  
  400.         }  
  401.         if (jClass.getSimpleName().compareToIgnoreCase("int") == 0  
  402.             || jClass.getSimpleName().compareToIgnoreCase("long") == 0  
  403.             || jClass.getSimpleName().compareToIgnoreCase("integer")==0) {  
  404.                 return "Integer";  
  405.         }else if (jClass.getSimpleName().compareToIgnoreCase("double") == 0  
  406.                 || jClass.getSimpleName().compareToIgnoreCase("float") == 0) {  
  407.             return "Double";  
  408.         } else if (jClass.getSimpleName().compareToIgnoreCase("boolean") == 0) {  
  409.             return "Boolean";  
  410.         } else if (jClass.getSimpleName().compareToIgnoreCase("string") == 0  
  411.                 || jClass.getSimpleName().compareToIgnoreCase("date") == 0) {  
  412.             return "String";  
  413.         }  
  414.         return jClass.getSimpleName();  
  415.     }  
  416.       
  417.     private static String JToD(Class<?> jClass,Method method) {  
  418.         if (jClass==null||method==null) {  
  419.             return "TObject";  
  420.         }  
  421.         if (IsEntiyClass(jClass)) {  
  422.             useEntiy.put(jClass, 1);  
  423.             return GetDClassName(jClass);  
  424.         }  
  425.         if (jClass.getSimpleName().compareToIgnoreCase("int") == 0  
  426.             || jClass.getSimpleName().compareToIgnoreCase("long") == 0  
  427.             || jClass.getSimpleName().compareToIgnoreCase("integer")==0) {  
  428.             return "Integer";  
  429.         }else if (jClass.getSimpleName().compareToIgnoreCase("double") == 0  
  430.                 || jClass.getSimpleName().compareToIgnoreCase("float") == 0) {  
  431.             return "Double";  
  432.         } else if (jClass.getSimpleName().compareToIgnoreCase("boolean") == 0) {  
  433.             return "Boolean";  
  434.         } else if (jClass.getSimpleName().compareToIgnoreCase("string") == 0  
  435.                 || jClass.getSimpleName().compareToIgnoreCase("date") == 0) {  
  436.             return "String";  
  437.         } else if (jClass.getSimpleName().compareToIgnoreCase("list") == 0) {  
  438.             Class<?> genericType = GetGenericTypeByGetMethod(method);  
  439.             if (IsEntiyClass(genericType)) {  
  440.                 useEntiy.put(genericType, 1);  
  441.                 return GetDClassName(genericType)+"Array";  
  442.             }else {  
  443.                 return JToDBasic(genericType)+"Array";  
  444.             }  
  445.         }  
  446.         return jClass.getSimpleName();  
  447.     }  
  448.   
  449.     public static Class<?> GetGenericTypeByGetMethod(Method method){   
  450.         ParameterizedType pt= (ParameterizedType)method.getGenericReturnType();   
  451.         if (pt!=null&&pt.getActualTypeArguments()!=null&&pt.getActualTypeArguments().length>0) {  
  452.             return (Class<?>)pt.getActualTypeArguments()[0];  
  453.         }  
  454.         return null;   
  455.     }  
  456.       
  457.     private static boolean IsEntiyClass(Class<?> jClass){  
  458.         return (jClass!=null&&jClass.getAnnotation(Entity.class)!=null);  
  459.     }  
  460.       
  461.     private static String GetDUintName(Class<?> jClass) {  
  462.         return "U"+jClass.getSimpleName()+"Obj";  
  463.     }  
  464.       
  465.     private static String GetDClassName(Class<?> jClass){  
  466.         return "T" + jClass.getSimpleName();  
  467.     }  
  468.       
  469.     private static void GetJsonConvertString(StringBuffer sb,String fieldName,String fixedName,PropertyDescriptor pd){  
  470.         Class<?> jClass = pd.getPropertyType();  
  471.         sb.append("if obj['").append(fieldName).append("']").append("<>nil then").append(NEWLINE);  
  472.         sb.append("begin").append(NEWLINE);  
  473.         if (jClass.getSimpleName().compareToIgnoreCase("int") == 0  
  474.             || jClass.getSimpleName().compareToIgnoreCase("long") == 0  
  475.             || jClass.getSimpleName().compareToIgnoreCase("integer")==0) {  
  476.             sb.append("\t").append(fixedName).append(" := ").append("obj['").append(fieldName).append("']").append(".AsInteger();").append(NEWLINE);  
  477.         }else if (jClass.getSimpleName().compareToIgnoreCase("double") == 0  
  478.                 || jClass.getSimpleName().compareToIgnoreCase("float") == 0) {  
  479.             sb.append("\t").append(fixedName).append(" := ").append("obj['").append(fieldName).append("']").append(".AsDouble();").append(NEWLINE);  
  480.         }else if (jClass.getSimpleName().compareToIgnoreCase("boolean") == 0) {  
  481.             sb.append("\t").append(fixedName).append(" := ").append("obj['").append(fieldName).append("']").append(".AsBoolean();").append(NEWLINE);  
  482.         } else if (jClass.getSimpleName().compareToIgnoreCase("string") == 0  
  483.                 || jClass.getSimpleName().compareToIgnoreCase("date") == 0) {  
  484.             sb.append("\t").append(fixedName).append(" := ").append("obj['").append(fieldName).append("']").append(".AsString();").append(NEWLINE);  
  485.         } else if (jClass.getSimpleName().compareToIgnoreCase("list") == 0) {  
  486.             Class<?> genericType = GetGenericTypeByGetMethod(pd.getReadMethod());  
  487.             sb.append("\t").append("jsonArray := obj['").append(fieldName).append("']").append(".AsArray();").append(NEWLINE);  
  488.             sb.append("\t").append("setLength(").append(fixedName).append(",jsonArray.Length);").append(NEWLINE);  
  489.             sb.append("\t").append("for i:=0 to jsonArray.Length-1 do").append(NEWLINE);  
  490.             sb.append("\t").append("begin").append(NEWLINE);  
  491.             if (IsEntiyClass(genericType)){  
  492.                 sb.append("\t\t").append(fixedName).append("[i] := ").append(GetDClassName(genericType))  
  493.                     .append(".Create(").append("jsonArray.O[i]").append(");").append(NEWLINE);  
  494.             }else {  
  495.                 sb.append("\t\t").append(fixedName).append("[i] := ").append("jsonArray.")  
  496.                     .append(GetJsonBasicString(genericType)).append("[i]").append(");").append(NEWLINE);  
  497.             }  
  498.             sb.append("\tend;").append(NEWLINE);  
  499.         }else if(IsEntiyClass(jClass)){  
  500.             sb.append("\t").append(fixedName).append(" := ").append(GetDClassName(jClass)).append(".Create(").append("obj['"+fieldName+"']);").append(NEWLINE);  
  501.         }  
  502.         sb.append("end;").append(NEWLINE);  
  503.         return;  
  504.     }  
  505.   
  506.     private static Object GetJsonBasicString(Class<?> jClass) {  
  507.         if (jClass.getSimpleName().compareToIgnoreCase("int") == 0  
  508.             || jClass.getSimpleName().compareToIgnoreCase("long") == 0  
  509.             || jClass.getSimpleName().compareToIgnoreCase("integer")==0) {  
  510.                 return "I";  
  511.             }else if (jClass.getSimpleName().compareToIgnoreCase("double") == 0  
  512.                     || jClass.getSimpleName().compareToIgnoreCase("float") == 0) {  
  513.                 return "D";  
  514.             }else if (jClass.getSimpleName().compareToIgnoreCase("boolean") == 0) {  
  515.                 return "B";  
  516.             } else if (jClass.getSimpleName().compareToIgnoreCase("string") == 0  
  517.                     || jClass.getSimpleName().compareToIgnoreCase("date") == 0) {  
  518.                 return "S";  
  519.             }  
  520.         return "S";  
  521.     }  
  522. }  
posted on 2014-07-07 10:39  tosecondlife  阅读(968)  评论(0编辑  收藏  举报