All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.gdface.utils.MiscellaneousUtils Maven / Gradle / Ivy

There is a newer version: 3.2.1
Show newest version
package net.gdface.utils;

import static net.gdface.utils.ConditionChecks.checkNotNull;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Map.Entry;

/**
 * 杂项(未分类)工具箱
 * @author guyadong
 *
 */
public class MiscellaneousUtils {
	/**
	 * 将{@code URL}字符串转换为{@code URI}对象
* 在转换过程中会将自动对不符合URI规范的字符进行编码,
* 在转换过程中先从字符串生成{@code URL}对象,如果{@code String}不能转换成URL对象,则抛出异常 * @param urlStr * @return {@code URI}对象 * @throws MalformedURLException */ public static final URI createURI(String urlStr) throws MalformedURLException{ try { return new URI(urlStr); } catch (URISyntaxException e) { try { URL url=new URL(urlStr); return new URI(url.getProtocol(),url.getUserInfo(),url.getHost(),url.getPort(),url.getPath(),url.getQuery(),url.getRef()); } catch (URISyntaxException e1) { throw new RuntimeException(e1); } } } /** * 对{@link Map}中元素以key排序后,每行以{key}={value}形式输出到{@link Writer}
* map为空或null时则不向writer写入任何内容 * @param map * @param writer 为null抛出{@link IllegalArgumentException} * @param lineSeparator 换行符,为null则使用系统默认的换行符(windows \n linux \r\n) * @throws IOException */ public static final void storeSortedMap(Map map,Writer writer, String lineSeparator) throws IOException { Assert.notNull(writer, "writer"); TreeMap sortedMap = new TreeMap(); if(null!=map){ sortedMap.putAll(map); } BufferedWriter bw=(writer instanceof BufferedWriter)?(BufferedWriter)writer : new BufferedWriter(writer); for (Entry e:sortedMap.entrySet()) { bw.write(e.getKey() + "=" + e.getValue()); if(null==lineSeparator){ bw.newLine(); }else{ bw.write("\n"); } } bw.flush(); } /** * 对 {@link Collection}中元素排序后(去除重复),元素分行输出到{@link Writer}
* collection为空或null时则不向writer写入任何内容 * @param collection * @param writer 为null抛出{@link IllegalArgumentException} * @param lineSeparator 换行符,为null则使用系统默认的换行符(windows \n linux \r\n) * @throws IOException */ public static final void storeSortedSet(Collection collection,Writer writer, String lineSeparator) throws IOException { Assert.notNull(writer, "writer"); TreeSet sortedSet = new TreeSet(); if(null!=collection){ sortedSet.addAll(collection); } BufferedWriter bw=(writer instanceof BufferedWriter)?(BufferedWriter)writer : new BufferedWriter(writer); for (String e:sortedSet) { bw.write(e); if(null==lineSeparator){ bw.newLine(); }else{ bw.write("\n"); } } bw.flush(); } /** * 比较两个Map是否相等 * @param m1 * @param m2 * @return 相等返回{@code true},否则返回{@code false} */ public static final boolean equals(Map m1,Map m2){ if(m1==m2){ return true; } if(null ==m1 || null ==m2){ return false; } if(m1.size() != m2.size()){ return false; } for(Entry entry:m1.entrySet()){ K key = entry.getKey(); if(!m2.containsKey(key)){ return false; } V v1 = entry.getValue(); V v2 = m2.get(key); if(v1 ==v2 ) { continue; } if(null ==v1 || null ==v2){ return false; } if(!v1.equals(v2)){ return false; } } return true; } /** * 将{@code input}用{@code delim}指定的分隔符切分为不含空格和分隔符的一组字符串 * @param input 输入字符串 * @param delim 包含多个分隔符的字符串 * @return {@code input}或{@code delim}为{@code null}时返回空表 */ public static final List elementsOf(String input,String delim) { List list = new ArrayList(); if (input != null && delim != null) { StringTokenizer st = new StringTokenizer(input, delim); while (st.hasMoreTokens()) { list.add(st.nextToken()); } } return list; } /** * 将{@code input}用分隔符{@code ;,\t\r\f\n}切分为不含空格和分隔符的一组字符串 * @param input * @return {@code input}为{@code null}时返回空表 */ public static final List elementsOf(String input) { return elementsOf(input," ,;\t\n\r\f"); } /** * 根据class path 字符串创建 {@link URLClassLoader}实例 * @param classpath class path 字符串 * @return URLClassLoader 实例, {@code classpath} 为空或{@code null}或{@code classpath}解析出的元素为空则返回{@code null} */ public static final URLClassLoader buildClassLoader(String classpath){ if(classpath != null && classpath.length() > 0){ classpath = normalizeClasspath(classpath); List paths = elementsOf(classpath, File.pathSeparator + "\t\n\r\f"); ArrayList urls = new ArrayList(paths.size()); for(String path:paths){ try { urls.add(new File(path).toURI().toURL()); } catch (MalformedURLException e) { // DO NOTHING } } if(!urls.isEmpty()){ return new URLClassLoader(urls.toArray(new URL[urls.size()])); } } return null; } /** * 归一化 class path字符串,将','转为指定平台的路径分隔符 * @param classpath * @return 归一化后的 class path 字符串 */ public static final String normalizeClasspath(String classpath){ if( classpath != null && classpath.length() > 0 ){ // 允许 , 做分隔符 classpath = classpath.replaceAll(",", File.pathSeparator); // linux下允许用 ;号做分隔符 if(File.pathSeparatorChar != ';'){ classpath = classpath.replaceAll(";", File.pathSeparator); } } return classpath; } /** * 将指定的类名列表加载为类返回类列表, * @param classNames 类名列表 * @param classpath 类加载路径class path,可为{@code null} * @param initialize 是否初始化类 * @return 类列表 {@code classNames}为{@code null}返回空表 * @throws ClassNotFoundException */ public static final List> loadClasses(Iterable classNames,String classpath, boolean initialize) throws ClassNotFoundException{ LinkedList> classes = new LinkedList>(); if(classNames != null){ for(String classname:classNames){ try { if(initialize){ classes.add(Class.forName(classname)); }else{ classes.add(Class.forName(classname,initialize,MiscellaneousUtils.class.getClassLoader())); } } catch (ClassNotFoundException e) { ClassLoader classLoader = buildClassLoader(classpath); if(classLoader!= null){ try { classes.add(Class.forName(classname, initialize, classLoader)); continue; } catch (ClassNotFoundException e1) { } } throw e; } } } return classes; } /** * 将指定的类名列表加载为类返回类列表, * @param classNames 类名列表 * @param classpath 类加载路径class path,可为{@code null} * @return 类列表 {@code classNames}为{@code null}返回空表 * @throws ClassNotFoundException */ public static final List> loadClasses(Iterable classNames,String classpath) throws ClassNotFoundException{ return loadClasses(classNames,classpath,true); } /** * 将指定的类名列表加载为类返回类列表, * @param classNames {@code ;,}或空格'分隔类名列表 * @param classpath 类加载路径class path,可为{@code null} * @param initialize 是否初始化类 * @return 类列表 {@code classNames}为{@code null}返回空表 * @throws ClassNotFoundException */ public static final List> loadClasses(String classNames,String classpath, boolean initialize) throws ClassNotFoundException{ return loadClasses(elementsOf(classNames), classpath, initialize); } /** * 将指定的类名列表加载为类返回类列表, * @param classNames {@code ;,}或空格'分隔类名列表 * @param classpath 类加载路径class path,可为{@code null} * @return 类列表 {@code classNames}为{@code null}返回空表 * @throws ClassNotFoundException */ public static final List> loadClasses(String classNames,String classpath) throws ClassNotFoundException{ return loadClasses(classNames, classpath, true); } /** * 根据指定的参数返回,查找类的构造方法
* 该方法会称尝试调用{@link Class#getConstructor(Class...)}查找,如果成功则返回构造器对象, * 否则会遍历类所有公开构造器,使用{@link Class#isAssignableFrom(Class)}来对参数类型比较, * 返回参数类型匹配父类的构造器对象,如果还是找不到则抛出异常 * @param clazz * @param args 构造方法参数 * @return 构造方法 * @throws NoSuchMethodException 找不到匹配的构造方法则抛出异常 */ @SuppressWarnings("unchecked") public static Constructor getConstructor(Class clazz,Class ...args) throws NoSuchMethodException { checkNotNull(clazz,"clazz is null"); checkNotNull(args,"args is null"); for(int i = 0; i < args.length; i++){ checkNotNull(args[i],"args["+i+"] is null"); } try { return clazz.getConstructor(args); } catch (NoSuchMethodException e) { for(Constructor ctor:clazz.getConstructors()){ Class[] parameterTypes = ctor.getParameterTypes(); if(args.length == parameterTypes.length){ boolean matched = true; for(int i=0; i) ctor; } } } throw new NoSuchMethodException(clazz.getName() + "." + argumentTypesToString(args)); } } private static String argumentTypesToString(Class[] argTypes) { StringBuilder buf = new StringBuilder(); buf.append("("); if (argTypes != null) { for (int i = 0; i < argTypes.length; i++) { if (i > 0) { buf.append(", "); } Class c = argTypes[i]; buf.append((c == null) ? "null" : c.getName()); } } buf.append(")"); return buf.toString(); } /** * 返回折叠字符串 * @param input * @param limit * @return 当input长度大于limit,且大于6字符时输出折叠显示的长度为limit字符串缩略部分以'...'代替,否则返回input */ public static String fold(String input,int limit){ if(input != null && input.length() > 6 && input.length() > limit){ int leftIndex = (limit - 3 + 1)/2; String left = input.substring(0, leftIndex); int rightIndex= input.length() - ((limit - 3)/2); String right = input.substring(rightIndex); return left + "..." + right; } return input; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy