这篇文章不是自己写的,是参考别人的代码写出来的。
不说什么,把代码粘贴进自己的工程,断点看下就知道具体是怎么写的了。
package com.zrobots.domain;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.junit.Test;
import javax.tools.*;
import java.io.File;
import java.lang.reflect.Field;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Iterator;
/**
* @Description:
* @Package: com.zrobots.domain
* @Date: Created in 2018/5/22 16:04
* @author: weizhaoli
*/
public class BeanUtils {
private String jsonStr = "{\"name\": \"jack\",\"age\": 10.0}";
private String className = "User";
private String packageName = "com.zrbots.domain";
@Test
public void test() throws Exception{
Class aClass = createBean(jsonStr, packageName, className);
Object o = aClass.newInstance();
Field[] fields = aClass.getFields();
for (Field field : fields){
System.out.println(field.getName());
}
System.out.println(o);
Field field = aClass.getField("name");
// System.out.println(field.getName());
}
/**
* 由JSON字符串生成Class对象
*
* @param jsonStr
* @param className 待生成Bean对象的名称
*/
public static Class createBean(String jsonStr, String packageName,String className) {
try {
JSONObject job = JSONObject.fromObject(jsonStr);
String beanStr = createObject(job, packageName, className, 0);
return compile(packageName + "." + className, beanStr);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* 由JSONObject生成Bean对象字符串
*
* @param job
* @param className 待生成Bean对象的名称
* @param outCount 外部类的个数
* @return LinkedList<String>: 生成的Bean对象的字符串
*/
private static String createObject(JSONObject job, String packageName, String className, int outCount) {
final StringBuilder sb = new StringBuilder();
String separator = System.getProperty("line.separator");
// 生成的Bean类前部的缩进空间
String classFrontSpace = "";
// 生成的Bean类字段前部的缩进空间
String fieldFrontSpace = " ";
for (int i = 0; i < outCount; i++) {
classFrontSpace += " ";
fieldFrontSpace += " ";
}
if (outCount == 0){
sb.append(classFrontSpace + "package " + packageName + ";");
sb.append(classFrontSpace + "import java.util.List;");
sb.append(classFrontSpace + "public class " + className + " {");
}else {
sb.append(classFrontSpace + "class " + className + " {");
}
Iterator<?> it = job.keys();
while (it.hasNext()) {
String key = (String) it.next();
try {
Object obj = job.get(key);
if(obj instanceof JSONArray) {
// 判断类是否为基本数据类型,如果为自定义类则字段类型取将key的首字母大写作为内部类名称
String fieldType = ((JSONArray)obj).get(0) instanceof JSONObject ?
"" : ((JSONArray)obj).get(0).getClass().getSimpleName();
if(fieldType == "") {
fieldType = String.valueOf(Character.isUpperCase(key.charAt(0)) ?
key.charAt(0) : Character.toUpperCase(key.charAt(0))) + key.substring(1);
}
sb.append(separator);
sb.append(fieldFrontSpace + "public List<" + fieldType + "> " + key + ";");
// 如果字段类型为自定义类类型,则取JSONArray中第一个JSONObject生成Bean
if(((JSONArray)obj).get(0) instanceof JSONObject) {
sb.append(separator);
sb.append(separator);
sb.append(fieldFrontSpace + "/** "+ fieldType +" is the inner class of "+ className +" */");
sb.append(separator);
sb.append(createObject((JSONObject)((JSONArray)obj).get(0), packageName, fieldType, outCount+1));
}
} else if(obj instanceof JSONObject) {
String fieldType = String.valueOf(Character.isUpperCase(key.charAt(0)) ?
key.charAt(0) : Character.toUpperCase(key.charAt(0))) + key.substring(1);
sb.append(separator);
sb.append(fieldFrontSpace + "public List<" + fieldType + "> " + key + ";");
sb.append(separator);
sb.append(separator);
sb.append(fieldFrontSpace + "/** "+ fieldType +" is the inner class of "+ className +" */");
sb.append(separator);
sb.append(createObject((JSONObject)obj, packageName, fieldType, outCount+1));
} else {
String type = obj.getClass().getSimpleName();
sb.append(separator);
sb.append(fieldFrontSpace + "public " + type + " " + key + ";");
sb.append(separator);
sb.append(fieldFrontSpace + "public " + type + " get" + key.substring(0, 1).toUpperCase() + key.substring(1) +"() {");
sb.append(separator);
sb.append(fieldFrontSpace + fieldFrontSpace + "return this." + key + ";");
sb.append(separator);
sb.append(fieldFrontSpace + "}");
sb.append(separator);
sb.append(fieldFrontSpace + "public void set" + key.substring(0, 1).toUpperCase() + key.substring(1) + "(" + type + " " +key + ") {");
sb.append(separator);
sb.append(fieldFrontSpace + fieldFrontSpace + "this." + key + " = " + key + ";");
sb.append(separator);
sb.append(fieldFrontSpace + "}");
sb.append(separator);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
sb.append(separator);
sb.append(classFrontSpace + "}");
sb.append(separator);
return sb.toString();
}
private final static Class<?> compile(String name, String content) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
StrSrcJavaObject srcObject = new StrSrcJavaObject(name, content);
Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(srcObject);
String flag = "-d";
String outDir = "";
try {
File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());
outDir = classPath.getAbsolutePath() + File.separator;
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
Iterable<String> options = Arrays.asList(flag, outDir);
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);
boolean result = task.call();
if (result == true) {
System.out.println("Compile it successfully.");
try {
return Class.forName(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return null;
}
private static class StrSrcJavaObject extends SimpleJavaFileObject {
private String content;
public StrSrcJavaObject(String name, String content) {
super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE);
this.content = content;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return content;
}
}
}