`
收藏列表
标题 标签 来源
java 类 clone 复制工具类 java 工具类 clone
package com.zuidaima.n_app.util;  
  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Field;  
import java.lang.reflect.InvocationTargetException;  
import java.lang.reflect.Modifier;  
import java.util.Arrays;  
import java.util.Collection;  
import java.util.HashSet;  
import java.util.Map;  
import java.util.Set;  
  
/** 
 * 克隆工具类 
 * @author lujijiang@gmail.com www.zuidaima.com
 * 
 */  
public class Clone {  
    /** 
     * 无需进行复制的特殊类型数组 
     */  
    static Class[] needlessCloneClasses = new Class[]{String.class,Boolean.class,Character.class,Byte.class,Short.class,  
        Integer.class,Long.class,Float.class,Double.class,Void.class,Object.class,Class.class  
    };  
    /** 
     * 判断该类型对象是否无需复制 
     * @param c 指定类型 
     * @return 如果不需要复制则返回真,否则返回假 
     */  
    private static boolean isNeedlessClone(Class c){  
        if(c.isPrimitive()){//基本类型  
            return true;  
        }  
        for(Class tmp:needlessCloneClasses){//是否在无需复制类型数组里  
            if(c.equals(tmp)){  
                return true;  
            }  
        }  
        return false;  
    }  
      
    /** 
     * 尝试创建新对象 
     * @param c 原始对象 
     * @return 新的对象 
     * @throws IllegalAccessException 
     */  
    private static Object createObject(Object value) throws IllegalAccessException{  
            try {  
                return value.getClass().newInstance();  
            } catch (InstantiationException e) {  
                return null;  
            } catch (IllegalAccessException e) {  
                throw e;  
            }  
    }  
      
    /** 
     * 复制对象数据 
     * @param value 原始对象 
     * @param level 复制深度。小于0为无限深度,即将深入到最基本类型和Object类级别的数据复制; 
     * 大于0则按照其值复制到指定深度的数据,等于0则直接返回对象本身而不进行任何复制行为。 
     * @return 返回复制后的对象 
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     * @throws InvocationTargetException 
     * @throws NoSuchMethodException 
     */  
    public static Object clone(Object value,int level) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException{  
        if(value==null){  
            return null;  
        }  
        if(level==0){  
            return value;  
        }  
        Class c = value.getClass();  
        if(isNeedlessClone(c)){  
            return value;  
        }  
        level--;  
        if(value instanceof Collection){//复制新的集合  
            Collection tmp = (Collection)c.newInstance();  
            for(Object v:(Collection)value){  
                tmp.add(clone(v,level));//深度复制  
            }  
            value = tmp;  
        }  
        else if(c.isArray()){//复制新的Array  
            //首先判断是否为基本数据类型  
            if(c.equals(int[].class)){  
                int[] old = (int[])value;  
                value = (int[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(short[].class)){  
                short[] old = (short[])value;  
                value = (short[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(char[].class)){  
                char[] old = (char[])value;  
                value = (char[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(float[].class)){  
                float[] old = (float[])value;  
                value = (float[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(double[].class)){  
                double[] old = (double[])value;  
                value = (double[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(long[].class)){  
                long[] old = (long[])value;  
                value = (long[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(boolean[].class)){  
                boolean[] old = (boolean[])value;  
                value = (boolean[])Arrays.copyOf(old, old.length);  
            }  
            else if(c.equals(byte[].class)){  
                byte[] old = (byte[])value;  
                value = (byte[])Arrays.copyOf(old, old.length);  
            }  
            else {  
                Object[] old = (Object[])value;  
                Object[] tmp = (Object[])Arrays.copyOf(old, old.length, old.getClass());  
                for(int i = 0;i<old.length;i++){  
                    tmp[i] = clone(old[i],level);  
                }  
                value = tmp;  
            }  
        }  
        else if(value instanceof Map){//复制新的MAP  
            Map tmp = (Map)c.newInstance();  
            Map org = (Map)value;  
            for(Object key:org.keySet()){  
                tmp.put(key, clone(org.get(key),level));//深度复制  
            }  
            value = tmp;  
        }  
        else {  
            Object tmp = createObject(value);  
            if(tmp==null){//无法创建新实例则返回对象本身,没有克隆  
                return value;  
            }  
            Set<Field> fields = new HashSet<Field>();  
            while(c!=null&&!c.equals(Object.class)){  
                fields.addAll(Arrays.asList(c.getDeclaredFields()));  
                c = c.getSuperclass();  
            }  
            for(Field field:fields){  
                if(!Modifier.isFinal(field.getModifiers())){//仅复制非final字段  
                    field.setAccessible(true);  
                    field.set(tmp, clone(field.get(value),level));//深度复制  
                }  
            }  
            value = tmp;  
        }  
        return value;  
    }  
      
    /** 
     * 浅表复制对象 
     * @param value 原始对象 
     * @return 复制后的对象,只复制一层 
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     * @throws InvocationTargetException 
     * @throws NoSuchMethodException 
     */  
    public static Object clone(Object value) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException{  
        return clone(value,1);  
    }  
      
    /** 
     * 深度复制对象 
     * @param value 原始对象 
     * @return 复制后的对象 
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     * @throws InvocationTargetException 
     * @throws NoSuchMethodException 
     */  
    public static Object deepClone(Object value) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException{  
        return clone(value,-1);  
    }  
}

	    			
spring 事务变量 spring
Spring事务的隔离级别

博客分类: SSH
StrutsHibernateSpring
 
1.	 ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
2.	 ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
3.	 ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
4.	 ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
5.	 ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。

事务传播行为种类

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,

它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

事务传播行为类型

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。	
ctx变量的设置 jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
递归求全排列+条件筛选,代码 公司笔试算法题
public static void permutation(int[] src, int m) {
		if (m == src.length) {
			if (src.length > 3 && src[2] != 4) {
				boolean bPrint = true;
				for (int i = 0; i < src.length - 1; i++) {
					if ((src[i] == 3 && src[i + 1] == 5)
							|| (src[i] == 5 && src[i + 1] == 3)) {
						bPrint = false;
					}
				}
				if (bPrint)
					print(src);
			}
		} else {
			for (int i = m; i < src.length; i++) {
				swap(src, m, i);
				permutation(src, m + 1);
				swap(src, m, i);
			}
		}
	}

	public static void print(int[] src) {
		for (int i = 0; i < src.length; i++)
			System.out.print(src[i]);
		System.out.println();
	}

	private static void swap(int[] src, int m, int i) {
		int t = src[m];
		src[m] = src[i];
		src[i] = t;
	}

Global site tag (gtag.js) - Google Analytics