/*
* Copyright 2005 Joe Walker
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.directwebremoting.util; import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set; import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.transform.TransformerFactoryConfigurationError; /**
* 一些通用的方法
* Various utilities, mostly to make up for JDK 1.4 functionallity that is not
* in JDK 1.3
* @author Joe Walker [joe at getahead dot ltd dot uk]
*/
public final class LocalUtil
{
/**
* splitInbound() returns the type info in this parameter
*/
public static final int INBOUND_INDEX_TYPE = 0; /**
* splitInbound() returns the value info in this parameter
*/
public static final int INBOUND_INDEX_VALUE = 1; /**
* Prevent instansiation
*/
private LocalUtil()
{
} /**
* Replacement for String#replaceAll(String, String) in JDK 1.4+
* @param text source text
* @param repl the stuff to get rid of
* @param with the stuff to replace it with
* @return replaced text or null if any args are null
*/
public static String replace(String text, String repl, String with)
{
if (text == null || repl == null || with == null || repl.length() == 0)
{
return text;
} StringBuffer buf = new StringBuffer(text.length());
int searchFrom = 0;
while (true)
{
int foundAt = text.indexOf(repl, searchFrom);
if (foundAt == -1)
{
break;
} buf.append(text.substring(searchFrom, foundAt)).append(with);
searchFrom = foundAt + repl.length();
}
buf.append(text.substring(searchFrom)); return buf.toString();
} /**
* 判断给定的字符串是否符合 Java 标识符的规范
*
* Determines if the specified string is permissible as a Java identifier.
* Returns true if the string is non-null, non-zero length with a Java
* identifier start as the first character and Java identifier parts in all
* remaining characters.
* @param test the string to be tested.
* @return true if the string is a Java identifier, false otherwise.
* @see java.lang.Character#isJavaIdentifierPart(char)
* @see java.lang.Character#isJavaIdentifierStart(char)
*/
public static boolean isJavaIdentifier(String test)
{
if (test == null || test.length() == 0)
{
return false;
} if (!Character.isJavaIdentifierStart(test.charAt(0)) && test.charAt(0) != '_')
{
return false;
} for (int i = 1; i < test.length(); i++)
{
if (!Character.isJavaIdentifierPart(test.charAt(i)) && test.charAt(i) != '_')
{
return false;
}
} return true;
} /**
* Determines if the specified string contains only Unicode letters or
* digits as defined by {@link Character#isLetterOrDigit(char)}
* @param test The string to test
* @return true if the string is non-null, non-empty and contains only
* characters that are unicode letters or digits
* @see Character#isLetterOrDigit(char)
*/
public static boolean isLetterOrDigitOrUnderline(String test)
{
if (test == null || test.length() == 0)
{
return false;
} for (int i = 0; i < test.length(); i++)
{
if (!Character.isLetterOrDigit(test.charAt(i)) && test.charAt(i) != '_')
{
return false;
}
} return true;
} /**
* True if c1 is java.lang.Boolean and c2 is boolean, etc.
* @param c1 the first class to test
* @param c2 the second class to test
* @return true if the classes are equivalent
*/
public static boolean isEquivalent(Class c1, Class c2)
{
if (c1 == Boolean.class || c1 == Boolean.TYPE)
{
return c2 == Boolean.class || c2 == Boolean.TYPE;
}
else if (c1 == Byte.class || c1 == Byte.TYPE)
{
return c2 == Byte.class || c2 == Byte.TYPE;
}
else if (c1 == Character.class || c1 == Character.TYPE)
{
return c2 == Character.class || c2 == Character.TYPE;
}
else if (c1 == Short.class || c1 == Short.TYPE)
{
return c2 == Short.class || c2 == Short.TYPE;
}
else if (c1 == Integer.class || c1 == Integer.TYPE)
{
return c2 == Integer.class || c2 == Integer.TYPE;
}
else if (c1 == Long.class || c1 == Long.TYPE)
{
return c2 == Long.class || c2 == Long.TYPE;
}
else if (c1 == Float.class || c1 == Float.TYPE)
{
return c2 == Float.class || c2 == Float.TYPE;
}
else if (c1 == Double.class || c1 == Double.TYPE)
{
return c2 == Double.class || c2 == Double.TYPE;
}
else if (c1 == Void.class || c1 == Void.TYPE)
{
return c2 == Void.class || c2 == Void.TYPE;
} return false;
} /**
* @param type The class to de-primitivize
* @return The non-privitive version of the class
*/
public static Class getNonPrimitiveType(Class type)
{
if (!type.isPrimitive())
{
return type;
}
else if (type == Boolean.TYPE)
{
return Boolean.class;
}
else if (type == Byte.TYPE)
{
return Byte.class;
}
else if (type == Character.TYPE)
{
return Character.class;
}
else if (type == Short.TYPE)
{
return Short.class;
}
else if (type == Integer.TYPE)
{
return Integer.class;
}
else if (type == Long.TYPE)
{
return Long.class;
}
else if (type == Float.TYPE)
{
return Float.class;
}
else if (type == Double.TYPE)
{
return Double.class;
}
else if (type == Void.TYPE)
{
return Void.class;
} return null;
} /**
* Add headers to prevent browers and proxies from caching this reply.
* @param resp The response to add headers to
*/
public static void addNoCacheHeaders(HttpServletResponse resp)
{
// Set standard HTTP/1.1 no-cache headers.
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
resp.addHeader("Cache-Control", "post-check=0, pre-check=0"); // Set standard HTTP/1.0 no-cache header.
resp.setHeader("Pragma", "no-cache"); // Set to expire far in the past. Prevents caching at the proxy server
resp.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
} /**
* Is this class one that we auto fill, so the user can ignore?
* @param paramType The type to test
* @return true if the type is a Servlet type
*/
public static boolean isServletClass(Class paramType)
{
return paramType == HttpServletRequest.class ||
paramType == HttpServletResponse.class ||
paramType == ServletConfig.class ||
paramType == ServletContext.class ||
paramType == HttpSession.class;
} /**
* URL decode a value. This method gets around the lack of a
* decode(String, String) method in JDK 1.3.
* @param value The string to decode
* @return The decoded string
*/
public static String decode(String value)
{
if (!testedDecoder)
{
try
{
decode14 = URLDecoder.class.getMethod("decode", new Class[] { String.class, String.class });
}
catch (Exception ex)
{
if (!warn13)
{
log.warn("URLDecoder.decode(String, String) is not available. Falling back to 1.3 variant.");
warn13 = true;
}
} testedDecoder = true;
} if (decode14 != null)
{
try
{
return (String) decode14.invoke(null, new Object[] { value, "UTF-8" });
}
catch (Exception ex)
{
log.warn("Failed to use JDK 1.4 decoder", ex);
}
} return URLDecoder.decode(value);
} /**
* 用反射给对象设置属性集
*
* Set use reflection to set the setters on the object called by the keys
* in the params map with the corresponding values
* @param object The object to setup
* @param params The settings to use
* @param ignore List of keys to not warn about if they are not properties
* Note only the warning is skipped, we still try the setter
*/
public static void setParams(Object object, Map params, List ignore)
{
for (Iterator it = params.entrySet().iterator(); it.hasNext();)
{
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
Object value = entry.getValue(); try
{
setProperty(object, key, value);
}
catch (NoSuchMethodException ex)
{
if (ignore != null && !ignore.contains(key))
{
log.warn("No property '" + key + "' on " + object.getClass().getName());
}
}
catch (InvocationTargetException ex)
{
log.warn("Error setting " + key + "=" + value + " on " + object.getClass().getName(), ex.getTargetException());
}
catch (Exception ex)
{
log.warn("Error setting " + key + "=" + value + " on " + object.getClass().getName(), ex);
}
}
} /**
* 用反射给对象设置属性,通过给定的属性名。
*
* Set a property on an object using reflection
* @param object The object to call the setter on
* @param key The name of the property to set.
* @param value The new value to use for the property
* @throws NoSuchMethodException Passed on from reflection code
* @throws SecurityException Passed on from reflection code
* @throws IllegalAccessException Passed on from reflection code
* @throws IllegalArgumentException Passed on from reflection code
* @throws InvocationTargetException Passed on from reflection code
*/
public static void setProperty(Object object, String key, Object value) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
Class real = object.getClass(); String setterName = "set" + key.substring(0, 1).toUpperCase(Locale.ENGLISH) + key.substring(1); try
{
// Can we work with whatever type we were given?
Method method = real.getMethod(setterName, new Class[] { value.getClass() });
method.invoke(object, new Object[] { value });
return;
}
catch (NoSuchMethodException ex)
{
// If it is a string then next we try to coerce it to the right type
// otherwise we give up.
if (!(value instanceof String))
{
throw ex;
}
} Method[] methods = real.getMethods();
for (int i = 0; i < methods.length; i++)
{
Method setter = methods[i]; if (setter.getName().equals(setterName) && setter.getParameterTypes().length == 1)
{
Class propertyType = setter.getParameterTypes()[0];
try
{
Object param = LocalUtil.simpleConvert((String) value, propertyType);
setter.invoke(object, new Object[] { param });
return;
}
catch (IllegalArgumentException ex)
{
// The conversion failed - it was speculative anyway so we
// don't worry now
}
}
} throw new NoSuchMethodException("Failed to find a property called: " + key + " on " + object.getClass().getName());
} /**
* Can the type be used in a call to {@link #simpleConvert(String, Class)}?
* @param paramType The type to test
* @return true if the type is acceptable to simpleConvert()
*/
public static boolean isTypeSimplyConvertable(Class paramType)
{
return paramType == String.class ||
paramType == Integer.class ||
paramType == Integer.TYPE ||
paramType == Short.class ||
paramType == Short.TYPE ||
paramType == Byte.class ||
paramType == Byte.TYPE ||
paramType == Long.class ||
paramType == Long.TYPE ||
paramType == Float.class ||
paramType == Float.TYPE ||
paramType == Double.class ||
paramType == Double.TYPE ||
paramType == Character.class ||
paramType == Character.TYPE ||
paramType == Boolean.class ||
paramType == Boolean.TYPE;
} /**
* A very simple conversion function for all the IoC style setup and
* reflection that we are doing.
* @param value The value to convert
* @param paramType The type to convert to. Currently ony primitive types and
* String are supported.
* @return The converted object.
*/
public static Object simpleConvert(String value, Class paramType)
{
if (paramType == String.class)
{
return value;
} if (paramType == Character.class || paramType == Character.TYPE)
{
if (value.length() == 1)
{
return new Character(value.charAt(0));
}
else
{
throw new IllegalArgumentException("Can't more than one character in string - can't convert to char: '" + value + "'");
}
} String trimValue = value.trim(); if (paramType == Boolean.class)
{
if (trimValue.length() == 0)
{
return null;
} return Boolean.valueOf(trimValue);
} if (paramType == Boolean.TYPE)
{
return Boolean.valueOf(trimValue);
} if (paramType == Integer.class)
{
if (trimValue.length() == 0)
{
return null;
} return Integer.valueOf(trimValue);
} if (paramType == Integer.TYPE)
{
if (trimValue.length() == 0)
{
return new Integer(0);
} return Integer.valueOf(trimValue);
} if (paramType == Short.class)
{
if (trimValue.length() == 0)
{
return null;
} return Short.valueOf(trimValue);
} if (paramType == Short.TYPE)
{
if (trimValue.length() == 0)
{
return new Short((short) 0);
} return Short.valueOf(trimValue);
} if (paramType == Byte.class)
{
if (trimValue.length() == 0)
{
return null;
} return Byte.valueOf(trimValue);
} if (paramType == Byte.TYPE)
{
if (trimValue.length() == 0)
{
return new Byte((byte) 0);
} return Byte.valueOf(trimValue);
} if (paramType == Long.class)
{
if (trimValue.length() == 0)
{
return null;
} return Long.valueOf(trimValue);
} if (paramType == Long.TYPE)
{
if (trimValue.length() == 0)
{
return new Long(0);
} return Long.valueOf(trimValue);
} if (paramType == Float.class)
{
if (trimValue.length() == 0)
{
return null;
} return Float.valueOf(trimValue);
} if (paramType == Float.TYPE)
{
if (trimValue.length() == 0)
{
return new Float(0);
} return Float.valueOf(trimValue);
} if (paramType == Double.class)
{
if (trimValue.length() == 0)
{
return null;
} return Double.valueOf(trimValue);
} if (paramType == Double.TYPE)
{
if (trimValue.length() == 0)
{
return new Double(0);
} return Double.valueOf(trimValue);
} throw new IllegalArgumentException("Unsupported conversion type: " + paramType.getName());
} /**
* 得到除去包名的类名。
*
* Get the short class name (i.e. without the package part)
* @param clazz the class to get the short name of
* @return the class name of the class without the package name
*/
public static String getShortClassName(Class clazz)
{
String className = clazz.getName(); char[] chars = className.toCharArray();
int lastDot = 0;
for (int i = 0; i < chars.length; i++)
{
if (chars[i] == '.')
{
lastDot = i + 1;
}
else if (chars[i] == '$')
{
chars[i] = '.';
}
} // This might come up in scans for locale/charset issues. It's not an
// issue since we are talking about chars.
return new String(chars, lastDot, chars.length - lastDot);
} /**
* Is this object property one that we can use in a JSON style or do we need
* to get fancy. i.e does it contain only letters and numbers with an
* initial letter.
* @param name The name to test for JSON compatibility
* @return true if the name is simple
*/
public static boolean isSimpleName(String name)
{
if (name.length() == 0)
{
return false;
} if (JavascriptUtil.isReservedWord(name))
{
return false;
} boolean isSimple = Character.isLetter(name.charAt(0));
for (int i = 1; isSimple && i < name.length(); i++)
{
if (!Character.isLetterOrDigit(name.charAt(i)))
{
isSimple = false;
}
} return isSimple;
} /**
* Utility to essentially do Class forName and allow configurable
* Classloaders.
* <p>The initial implementation makes use of the context classloader for
* the current thread.
* @param className The class to create
* @return The class if it is safe or null otherwise.
* @throws ClassNotFoundException If <code>className</code> is not valid
*/
public static Class classForName(String className) throws ClassNotFoundException
{
// Class.forName(className);
return Thread.currentThread().getContextClassLoader().loadClass(className);
} /**
* Calling methods using reflection is useful for graceful fallback - this
* is a helper method to make this easy
* @param object The object to use as 'this'
* @param method The method to call, can be null in which case null is returned
* @param params The parameters to pass to the reflection call
* @return The results of calling method.invoke() or null
* @throws IllegalStateException If anything goes wrong
*/
public static Object invoke(Object object, Method method, Object[] params) throws IllegalStateException
{
Object reply = null;
if (method != null)
{
try
{
reply = method.invoke(object, params);
}
catch (InvocationTargetException ex)
{
throw new IllegalStateException("InvocationTargetException calling " + method.getName() + ": " + ex.getTargetException().toString());
}
catch (Exception ex)
{
throw new IllegalStateException("Reflection error calling " + method.getName() + ": " + ex.toString());
}
} return reply;
} /**
* Utility to essentially do Class forName with the assumption that the
* environment expects failures for missing jar files and can carry on if
* this process fails.
* @param name The name for debugging purposes
* @param className The class to create
* @param impl The implementation class - what should className do?
* @return The class if it is safe or null otherwise.
*/
public static Class classForName(String name, String className, Class impl)
{
Class clazz; try
{
clazz = classForName(className);
}
catch (ClassNotFoundException ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to ClassNotFoundException on " + className + ". Cause: " + ex.getMessage());
return null;
}
catch (NoClassDefFoundError ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to NoClassDefFoundError on " + className + ". Cause: " + ex.getMessage());
return null;
}
catch (TransformerFactoryConfigurationError ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to TransformerFactoryConfigurationError on " + className + ". Cause: " + ex.getMessage());
log.debug("Maybe you need to add xalan.jar to your webserver?");
return null;
} // Check it is of the right type
if (!impl.isAssignableFrom(clazz))
{
log.error("Class '" + clazz.getName() + "' does not implement '" + impl.getName() + "'.");
return null;
} // Check we can create it
try
{
clazz.newInstance();
}
catch (InstantiationException ex)
{
log.error("InstantiationException for '" + name + "' failed:", ex);
return null;
}
catch (IllegalAccessException ex)
{
log.error("IllegalAccessException for '" + name + "' failed:", ex);
return null;
}
catch (NoClassDefFoundError ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to NoClassDefFoundError on " + className + ". Cause: " + ex.getMessage());
return null;
}
catch (TransformerFactoryConfigurationError ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to TransformerFactoryConfigurationError on " + className + ". Cause: " + ex.getMessage());
log.debug("Maybe you need to add xalan.jar to your webserver?");
return null;
}
catch (Exception ex)
{
// For some reason we can't catch this?
if (ex instanceof ClassNotFoundException)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to ClassNotFoundException on " + className + ". Cause: " + ex.getMessage());
return null;
}
else
{
log.error("Failed to load '" + name + "' (" + className + ")", ex);
return null;
}
} return clazz;
} /**
* Utility to essentially do Class forName and newInstance with the
* assumption that the environment expects failures for missing jar files
* and can carry on if this process fails.
* @param name The name for debugging purposes
* @param className The class to create
* @param impl The implementation class - what should className do?
* @return The new instance if it is safe or null otherwise.
*/
public static Object classNewInstance(String name, String className, Class impl)
{
Class clazz; try
{
clazz = LocalUtil.classForName(className);
}
catch (ClassNotFoundException ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to ClassNotFoundException on " + className + ". Cause: " + ex.getMessage());
return null;
}
catch (NoClassDefFoundError ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to NoClassDefFoundError on " + className + ". Cause: " + ex.getMessage());
return null;
}
catch (TransformerFactoryConfigurationError ex)
{
// We expect this sometimes, hence debug
log.debug("Skipping '" + name + "' due to TransformerFactoryConfigurationError on " + className + ". Cause: " + ex.getMessage());
return null;
} // Check it is of the right type
if (!impl.isAssignableFrom(clazz))
{
log.error("Class '" + clazz.getName() + "' does not implement '" + impl.getName() + "'.");
return null;
} // Check we can create it
try
{
return clazz.newInstance();
}
catch (InstantiationException ex)
{
log.error("InstantiationException for '" + name + "' failed:", ex);
return null;
}
catch (IllegalAccessException ex)
{
log.error("IllegalAccessException for '" + name + "' failed:", ex);
return null;
}
catch (TransformerFactoryConfigurationError ex)
{
log.error("TransformerFactoryConfigurationError for '" + name + "' failed:", ex);
return null;
}
catch (Exception ex)
{
log.error("Failed to load creator '" + name + "', classname=" + className + ": ", ex);
return null;
}
} /**
* InputStream closer that can cope if the input stream is null.
* If anything goes wrong, the errors are logged and ignored.
* @param in The resource to close
*/
public static void close(InputStream in)
{
if (in == null)
{
return;
} try
{
in.close();
}
catch (IOException ex)
{
log.warn(ex.getMessage(), ex);
}
} /**
* InputStream closer that can cope if the input stream is null.
* If anything goes wrong, the errors are logged and ignored.
* @param in The resource to close
*/
public static void close(Reader in)
{
if (in == null)
{
return;
} try
{
in.close();
}
catch (IOException ex)
{
log.warn(ex.getMessage(), ex);
}
} /**
* InputStream closer that can cope if the input stream is null.
* If anything goes wrong, the errors are logged and ignored.
* @param in The resource to close
*/
public static void close(RandomAccessFile in)
{
if (in == null)
{
return;
} try
{
in.close();
}
catch (IOException ex)
{
log.warn(ex.getMessage(), ex);
}
} /**
* Return a List of superclasses for the given class.
* @param clazz the class to look up
* @return the List of superclasses in order going up from this one
*/
public static List getAllSuperclasses(Class clazz)
{
List classes = new ArrayList(); Class superclass = clazz.getSuperclass();
while (superclass != null)
{
classes.add(superclass);
superclass = superclass.getSuperclass();
} return classes;
} /**
* Return a list of all fields (whatever access status, and on whatever
* superclass they were defined) that can be found on this class.
* <p>This is like a union of {@link Class#getDeclaredFields()} which
* ignores and superclasses, and {@link Class#getFields()} which ignored
* non-pubic fields
* @param clazz The class to introspect
* @return The complete list of fields
*/
public static Field[] getAllFields(Class clazz)
{
List classes = getAllSuperclasses(clazz);
classes.add(clazz);
return getAllFields(classes);
} /**
* As {@link #getAllFields(Class)} but acts on a list of {@link Class}s and
* uses only {@link Class#getDeclaredFields()}.
* @param classes The list of classes to reflect on
* @return The complete list of fields
*/
private static Field[] getAllFields(List classes)
{
Set fields = new HashSet();
for (Iterator it = classes.iterator(); it.hasNext();)
{
Class clazz = (Class) it.next();
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
} return (Field[]) fields.toArray(new Field[fields.size()]);
} /**
* The log stream
*/
private static final Logger log = Logger.getLogger(LocalUtil.class); /**
* Have we given a warning about URLDecoder.decode() in jdk 1.3
*/
private static boolean warn13 = false; /**
* Have we tested for the correct URLDecoder.decode()
*/
private static boolean testedDecoder = false; /**
* Are we using the jdk 1.4 version of URLDecoder.decode()
*/
private static Method decode14 = null;
}

java常用工具方法2的更多相关文章

  1. Java常用工具方法

    以GET请求形式获取文本文件内容 /** * 以GET请求形式获取文本文件内容 * @param url http下载地址,比如http://www.abc.com/123.css * @return ...

  2. JavaEE-实验一 Java常用工具类编程

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.  使用类String类的分割split 将字符串  “Solutions to selected exercises ca ...

  3. jQuery常用工具方法

    前面的话 jQuery提供一些与元素无关的工具方法,不必选中元素,就可以直接使用这些方法.如果理解原生javascript的继承原理,那么就能理解工具方法的实质.它是定义在jQuery构造函数上的方法 ...

  4. JavaScript常用工具方法

    JavaScript常用工具方法 1.日期格式化 2.将日期字符串转换为Date,字符串格式为(yyyy-mm-dd hh:mm:ss) 3.JS获取当天00:00:00时间和23:59:59的时间 ...

  5. JavaScript 深入学习及常用工具方法整理 ---- 01.浮点数

    在JavaScript中是不区分整数值和浮点数值的,其中所有的数字均用浮点数值表示.JavaScript采用IEEE 754标准(有兴趣可以浏览网络规范分类下的IEEE 754标准,需要原文件请在留言 ...

  6. Java常用工具+类库合集

    1 常用工具 JVisual vm:可以直接通过软件包下载,支持本地以及远程JVM监控 JMH:Java Microbenchmark Harness,测试基准组件,精度可达纳秒级 JITWatch: ...

  7. Java代码使用正则验证和常用工具方法

    1.正则验证邮箱 public static boolean checkEmail(String email){ boolean flag = false; try{ String check = & ...

  8. JAVA常用工具类汇总

    一.功能方法目录清单: 1.getString(String sSource)的功能是判断参数是否为空,为空返回"",否则返回其值: 2.getString(int iSource ...

  9. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

随机推荐

  1. 152.Maximum Product Subarray---dp---连续子数组的最大乘积---《编程之美》2.13子数组的最大乘积

    题目链接:https://leetcode.com/problems/maximum-product-subarray/description/ 题目大意:给出一串数组,找出连续子数组中乘积最大的子数 ...

  2. oracle造成系统CPU过高的检查sql

    1. 根据占用CPU高的进程号来查询这个进程执行的SQL语句: CPU过高的进程号: #首先找到CPU过高的进程号 # top -bn1 是静态找到占用最高的进程 [root@localhost ~] ...

  3. Mysql自带profiling性能分析工具使用分享

    1. show variables like '%profiling%';(查看profiling信息)       2. set profiling=1;(开启profiling)   3. 执行S ...

  4. POJ 2348 Euclid's Game(辗转相除博弈+自由度分析)

    题目链接:http://poj.org/problem?id=2348 题目大意:给你两个数a,b,Stan和Ollie轮流操作,每次可以将较大的数减去较小的数的整数倍,相减后结果不能小于0,谁先将其 ...

  5. 【hdoj_1250】Hat's Fibonacci(大数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1250 思路:本题的Fibonacci数列是扩展的四阶的Fibonacci数列,用递推关系式求解即可. 题目 ...

  6. mvc部署

    权限中加入windows 2008中加入SERVICE,windows2003中加入NETWORK SERVICE

  7. python存取数据进阶技巧-pickle,array模块

    我们在存/取数据时,没有必要存成文本形式,多试试二进制形式,文本只是骗骗眼睛的,要更快和更高效 1.数组形式 如果我们需要一个之包含数字的列表,那就试试array.array,注意,不是numpy模块 ...

  8. Codeforces Round #492 (Div. 2) [Thanks, uDebug!]

    这次的题好奇怪哦... C - Tesla 思路:先把跟停车位相邻的车停进去,然后开始转圈... #include<bits/stdc++.h> #define LL long long ...

  9. karma+requirejs

    下面的介绍以karma能正常运行为前提,看karma系列文章:http://www.cnblogs.com/laixiangran/tag/Karma/ 目录结构 步骤 安装 npm install ...

  10. nodejs pm2配置使用教程

    pm2是非常优秀工具,它提供对基于node.js的项目运行托管服务.它基于命令行界面,提供很多特性: 内置的负载均衡器等等,下面我们就一起来看看吧. 一.简介 pm2是一个带有负载均衡功能的应用进程管 ...