Java转Delphi的工具类 3

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. }  

转载于:https://www.cnblogs.com/weixinserver/p/3829201.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是一本Delphi综合开发参考手册,书中几乎囊括了使用Delphi进行实用程序开发的全部知识,同时在讲解中结合了大量实用而又有代表性的示例和典型应用。全书共分36章,包括认识DelphiDelphi语言基础,Delphi控制语句,数组与算法,过程与函数,面向对象的程序设计,用户界面设计,菜单、工具栏和状态栏设计,对话框在程序中的应用,组件的使用,自制VCL组件,鼠标、键盘相关技术的应用,图形图像处理技术,多媒体技术,文件操作技术,系统控制技术,ADO数据库开发技术,常用数据组件,添加、删除和修改数据,浏览与查询数据,图表组件的设计,多层数据库程序,报表与打印程序设计,数据库安全技术,网络编程,Internet编程,数据通信,Windows API函数的应用,DLL动态链接库的使用,多线程的应用,消息处理技术,注册表的应用,程序优化,程序调试,自定义帮助,程序打包及安装等内容。书中各部分介绍的技术既相互独立又相互联系,可以逐步引导读者深入学习并掌握Delphi的编程知识、方法和编程技巧。 本书附有配套光盘。光盘提供了书中示例和典型应用实例的全部源代码,所有源代码都经过精心调试,在Windows 2000下测试通过,保证能够正常运行。 第1篇 Delphi基础篇  第1章 认识Delphi  第2章 Delphi语言基础   第3章 Delphi控制语句  第4章 数组与算法  第5章 过程与函数  第2篇 用户界面设计篇  第6章 面向对象的程序设计   第7章 用户界面设计  第8章 菜单、工具栏和状态栏设计  第9章 对话框在程序中的应用   第10章 组件的使用   第11章 自制VCL组件  第12章 鼠标、键盘相关技术的应用 第3篇 文件、图形与多媒体篇

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值