|
|
|
@ -7,6 +7,7 @@ import javax.tools.StandardJavaFileManager;
|
|
|
|
|
import javax.tools.ToolProvider;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
import java.io.FileFilter;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
import java.net.URI;
|
|
|
|
@ -19,7 +20,7 @@ import java.util.List;
|
|
|
|
|
import java.util.Stack;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* ClassUtil
|
|
|
|
|
* ClassUtil类工具
|
|
|
|
|
*
|
|
|
|
|
* @author wangbing
|
|
|
|
|
* @version 0.0.1
|
|
|
|
@ -28,28 +29,53 @@ import java.util.Stack;
|
|
|
|
|
public class ClassUtil {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取模板类所有字段
|
|
|
|
|
* 获取类的所有字段(不包含父类)
|
|
|
|
|
*
|
|
|
|
|
* @param clazz 模板对象
|
|
|
|
|
* @param clazz 类对象
|
|
|
|
|
* @return 字段集合
|
|
|
|
|
*/
|
|
|
|
|
public static Field[] getFields(Class clazz) {
|
|
|
|
|
return getFields(clazz, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取类所有字段
|
|
|
|
|
*
|
|
|
|
|
* @param clazz 类对象
|
|
|
|
|
* @param parentFirst 是否关注父类的字段
|
|
|
|
|
* @return
|
|
|
|
|
* @return 字段对象
|
|
|
|
|
*/
|
|
|
|
|
public static Field[] getFields(Class clazz, boolean parentFirst) {
|
|
|
|
|
Field[] fields = clazz.getDeclaredFields();
|
|
|
|
|
|
|
|
|
|
if (parentFirst) {
|
|
|
|
|
Field[] parentFields = getParentFields(clazz.getSuperclass());
|
|
|
|
|
return concat(fields, parentFields);
|
|
|
|
|
return ArrayUtil.merge(fields, parentFields);
|
|
|
|
|
}
|
|
|
|
|
return fields;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断是不是集合的实现类
|
|
|
|
|
* 获取父类字段集合
|
|
|
|
|
*
|
|
|
|
|
* @param clazz
|
|
|
|
|
* @param clazz 类对象
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private static Field[] getParentFields(Class clazz) {
|
|
|
|
|
if (clazz != null && clazz.getSuperclass() != null) {
|
|
|
|
|
Field[] pfs = clazz.getSuperclass().getDeclaredFields();
|
|
|
|
|
Field[] ppfs = getParentFields(clazz.getSuperclass());
|
|
|
|
|
return ArrayUtil.merge(pfs, ppfs);
|
|
|
|
|
}
|
|
|
|
|
return new Field[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断是不是集合的实现类
|
|
|
|
|
*
|
|
|
|
|
* @param clazz 类对象
|
|
|
|
|
* @return 是否
|
|
|
|
|
*/
|
|
|
|
|
public static boolean isCollection(Class<?> clazz) {
|
|
|
|
|
return Collection.class.isAssignableFrom(clazz);
|
|
|
|
|
}
|
|
|
|
@ -58,8 +84,8 @@ public class ClassUtil {
|
|
|
|
|
* 获取GET方法
|
|
|
|
|
*
|
|
|
|
|
* @param name 成员变量名
|
|
|
|
|
* @param pojoClass POJO对象
|
|
|
|
|
* @return 方法
|
|
|
|
|
* @param pojoClass 类对象
|
|
|
|
|
* @return 方法对象
|
|
|
|
|
*/
|
|
|
|
|
public static Method getMethod(String name, Class<?> pojoClass) {
|
|
|
|
|
String getMethodName = "get" + StringUtil.upperFirstWord(name);
|
|
|
|
@ -80,7 +106,7 @@ public class ClassUtil {
|
|
|
|
|
*
|
|
|
|
|
* @param name 成员变量名
|
|
|
|
|
* @param pojoClass POJO对象
|
|
|
|
|
* @return 方法
|
|
|
|
|
* @return 方法对象
|
|
|
|
|
*/
|
|
|
|
|
public static Method setMethod(String name, Class<?> pojoClass, Class<?> type) {
|
|
|
|
|
String setMethodName = "set" + StringUtil.upperFirstWord(name);
|
|
|
|
@ -91,6 +117,12 @@ public class ClassUtil {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断字段是否为自定义类
|
|
|
|
|
*
|
|
|
|
|
* @param field 字段
|
|
|
|
|
* @return 是否
|
|
|
|
|
*/
|
|
|
|
|
public static boolean isJavaClass(Field field) {
|
|
|
|
|
Class<?> fieldType = field.getType();
|
|
|
|
|
boolean isBaseClass = false;
|
|
|
|
@ -106,30 +138,10 @@ public class ClassUtil {
|
|
|
|
|
return isBaseClass;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Field[] getFields(Class clazz) {
|
|
|
|
|
return getFields(clazz, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Field[] getParentFields(Class parentClazz) {
|
|
|
|
|
if (parentClazz != null) {
|
|
|
|
|
Field[] fields = parentClazz.getDeclaredFields();
|
|
|
|
|
Field[] parentFields = getParentFields(parentClazz.getSuperclass());
|
|
|
|
|
return concat(fields, parentFields);
|
|
|
|
|
}
|
|
|
|
|
return new Field[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static Field[] concat(Field[] f1, Field[] f2) {
|
|
|
|
|
Field[] fields = new Field[f1.length + f2.length];
|
|
|
|
|
System.arraycopy(f1, 0, fields, 0, f1.length);
|
|
|
|
|
System.arraycopy(f2, 0, fields, f1.length, f2.length);
|
|
|
|
|
return fields;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param sourcePath 源文件路径
|
|
|
|
|
* @param classPath 编译文件路径
|
|
|
|
|
* @return
|
|
|
|
|
* @return 是否成功
|
|
|
|
|
*/
|
|
|
|
|
public static boolean compile(String sourcePath, String classPath) {
|
|
|
|
|
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
|
|
|
|
@ -147,7 +159,7 @@ public class ClassUtil {
|
|
|
|
|
* @param className 类名
|
|
|
|
|
* @param classContent 类内容
|
|
|
|
|
* @param classPath 编译路径
|
|
|
|
|
* @return
|
|
|
|
|
* @return 是否编译成功
|
|
|
|
|
*/
|
|
|
|
|
public static boolean compileStringJava(String className, String classContent, String classPath) {
|
|
|
|
|
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
|
|
|
|
@ -156,6 +168,10 @@ public class ClassUtil {
|
|
|
|
|
SimpleJavaFileObject simpleJavaFileObject = new SimpleJavaFileObject(
|
|
|
|
|
URI.create("string:///" + className.replace('.', '/') + JavaFileObject.Kind.SOURCE.extension),
|
|
|
|
|
JavaFileObject.Kind.SOURCE) {
|
|
|
|
|
@Override
|
|
|
|
|
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
|
|
|
|
|
return classContent;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
Iterable<JavaFileObject> simpleJavaFileObjects = Arrays.asList(simpleJavaFileObject);
|
|
|
|
|
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, simpleJavaFileObjects);
|
|
|
|
@ -247,6 +263,7 @@ public class ClassUtil {
|
|
|
|
|
/**
|
|
|
|
|
* 获取指定类
|
|
|
|
|
* 获取之前请确认是否加载 {@link #loadClass(File)}
|
|
|
|
|
* 与Class.forName()相比,两者都可以装载类,但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
|
|
|
|
|
*
|
|
|
|
|
* @param className 类名(包含package,不含后缀)
|
|
|
|
|
* @return 类
|
|
|
|
|