/**
* 根据传入的sql获得查询总行数的SQL语句
* @param sql SQL语句 必须有from的SQL查询语句
* @return 转换后查询总行数的SQL语句
public static String getCountSQL(String sql) {
return "SELECT COUNT(1) FROM " + StringUtil.subString(sql.toLowerCase(), "from");
/**
* 获得Class的字段
* @param clazz Class
* @param name 字段名
* @return 字段
public static Field getField(Class<?> clazz, String name) {
// 判断对象和字段名是否为空
if (clazz == null || EmptyUtil.isEmpty(name))
return null;
// 如果有复杂字段
if (name.indexOf(StringConstants.POINT) > -1)
return getField(getField(clazz, StringUtil.subStringEnd(name, StringConstants.POINT)), StringUtil.subString(name, StringConstants.POINT));
// 声明字段
Field f = null;
// 循环对象类
for (; clazz != Object.class && f == null; clazz = clazz.getSuperclass())
try {
// 获得字段
f = clazz.getDeclaredField(name);
} catch (Exception e) {}
// 返回null
return f;
/**
* 根据SQL获得表名
* @param sql 执行的SQL
* @return 截取出表名
public static String getTable(String sql) {
// 查找表名
String name = StringConstants.EMPTY;
if (sql.startsWith("insert"))
name = StringUtil.subString(sql, "into ", StringConstants.BLANK);
else if (sql.startsWith("update"))
name = StringUtil.subString(sql, "update ", StringConstants.BLANK);
else if (sql.startsWith("select"))
name = StringUtil.subString(sql, "from ", StringConstants.BLANK);
return name;
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
* @param object 调用的对象
* @param fieldName 属性名
* @return 属性值
public static Object getFieldValue(Object object, String fieldName) {
// 如果有复杂字段
if (fieldName.indexOf(StringConstants.POINT) > -1)
return getFieldValue(getFieldValue(object, StringUtil.subStringEnd(fieldName, StringConstants.POINT)), StringUtil.subString(fieldName, StringConstants.POINT));
// 获得字段
Field field = getField(object, fieldName);
// 判断字段为空 返回null
if (EmptyUtil.isEmpty(field))
return null;
try {
// 获得字段值
return makeAccessible(field).get(object);
} catch (IllegalAccessException e) {
Logs.error(e);
return null;
/**
* 截取字符串
* @param str 字符串
* @param start 开始字符
* @return 截取后的字符串
public static String subString(String str, int start) {
return EmptyUtil.isEmpty(str) ? StringConstants.EMPTY : subString(str, start, str.length());
/**
* 截取字符串
* @param str 要截取的字符串
* @param len 截取长度
* @return 截取后字符串
public String substring(String str, int len) {
// 判断字符串为空
if (EmptyUtil.isEmpty(str)) {
return str;
// 判断长度大于指定截取长度
if (str.length() > len) {
return StringUtil.subString(str, 0, len) + "...";
// 返回原字符串
return str;
/** * 转换日志 1 把字符串长于一定程度的信息截取 2把数组变成字符串 并截取一定长度 * @param params 写日志参数 * @return 参数 private static Object[] params(Object... params) { // 开启日志截取 if (CommonParams.LOGS_LEN > 0) // 循环处理日志 for (int i = 0; i < params.length; i++) { // 转换对象 Object obj = params[i]; // 判断类型 byte[] if (obj instanceof byte[]) obj = Arrays.toString((byte[]) obj); else if (obj instanceof String[]) obj = Arrays.toString((String[]) obj); // 获得对象 params[i] = StringUtil.subString(Conversion.toString(obj), 0, CommonParams.LOGS_LEN); // 返回对象 return params;
private static List<String> getClasses(String name, String packageName) {
// 获得文件名
File path = new File(name);
// 判断是否目录
if (path.isDirectory())
// 如果是目录
return Lists.newList(path.list());
if (name.indexOf(".jar!") > -1)
// 是否jar文件内
return getClassesFromJARFile(StringUtil.subString(name, "file:/", "!"), packageName + StringConstants.BACKSLASH);
// 返回空列表
return Lists.emptyList();
private static List<String> getClassesFromJARFile(String jar, String name) {
// 判断jar第二位是否: 不为:默认linux前面加上/
if (jar.indexOf(StringConstants.COLON) == -1)
jar = StringConstants.BACKSLASH + jar;
// 声明返回列表
List<String> list = Lists.newList();
// 获得jar流
try (JarInputStream jarFile = new JarInputStream(new FileInputStream(jar))) {
// 循环获得JarEntry
JarEntry jarEntry = null;
while ((jarEntry = jarFile.getNextJarEntry()) != null) {
// 判断是否包内class
String className = jarEntry.getName();
if (className.indexOf(name) > -1 && !className.equals(name))
list.add(StringUtil.subString(className, name));
} catch (IOException e) {
Logs.error(e);
// 返回列表
return list;
return StringUtil.subString(sb.toString(), 0, sb.length() - 1);