隨便寫寫

 

package com.haizol.mk.rfq;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.javassist.ClassPool;
import org.apache.ibatis.javassist.CtClass;
import org.apache.ibatis.javassist.CtField;
import org.apache.ibatis.javassist.CtMethod;
import org.apache.ibatis.javassist.CtNewMethod;
import org.junit.Test;
import org.springframework.beans.BeanUtils;

import com.haizol.common.utils.JacksonUtil;
import com.haizol.mk.rfq.common.utils.StreamUtil;

public class MyTest extends ClassLoader  {
    //模仿
    @Test
    public void mimicry(){
    	TestB testB = new TestB();
    	testB.setId(1l);
    	
    	//複製一個類的字段,並自定義一些字段,而後建立一個類
//    	String[] fields = getFields(testB.getClass(),"peter","coco");
//		Object obj = divField(TestA.class,fields);
//		BeanUtils.copyProperties(testB, obj);
//    	System.out.println(JacksonUtil.toJSon(obj));
    	
    	//自定義一些字段,而後建立一個類
    	Object obj2 = divField(TestA.class,"id","peter2");
		BeanUtils.copyProperties(testB, obj2);
    	System.out.println(JacksonUtil.toJSon(obj2));
    }

	//複製對象全部屬性值,並返回一個新對象
    public Object getObj(Class<?> clazz, Object srcObj) {
        try {
            Object newInstance = clazz.getDeclaredConstructor().newInstance();
            Field[] fields = srcObj.getClass().getDeclaredFields();
            for (Field oldInstanceField : fields) {
                String fieldName = oldInstanceField.getName();
                oldInstanceField.setAccessible(true);
                Field newInstanceField = newInstance.getClass().getDeclaredField(fieldName);
                newInstanceField.setAccessible(true);
                newInstanceField.set(newInstance, oldInstanceField.get(srcObj));
            }
            return newInstance;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //首字母大寫
    public String upperFirstStr(String str){
    	return str.substring(0,1).toUpperCase()+str.substring(1);
    }
    
    //得到一個類的全部字段,並能夠額外新增字段
    private String[] getFields(Class<?> c,String... fields){
    	List<String> aList = Stream.of(c.getDeclaredFields())
				.map(Field::getName)
				.collect(Collectors.toList());
		aList.addAll(Arrays.asList(fields));
		return aList.toArray(new String[]{});
    }
	
    //得到自定義字段對象
	public Object divField(Class<?> coco,String... fields){
		String className = coco.getName();
		try {
			CtClass cc = ClassPool.getDefault().get(className);
	        for (String methodName : Arrays.asList(fields)) {
	        	CtField ctField = new CtField(CtClass.longType, methodName,cc);
	           	cc.addField(ctField);
	           	
	         	CtMethod getMthd = CtNewMethod.make("public long get"+upperFirstStr(methodName)+"() { return "+methodName+";}", cc);
	           	cc.addMethod(getMthd);
	           	
	           	CtMethod setMthd = CtNewMethod.make("public void set"+upperFirstStr(methodName)+"(long "+methodName+") { this."+methodName+" = "+methodName+";}", cc);
	           	cc.addMethod(setMthd);
			}

	        Class<?> clazz = defineClass(className, cc.toBytecode(),0,cc.toBytecode().length);
	        
	        // 解凍CtClass對象
	        cc.defrost();
	        return getObj(clazz,new TestA());
		} catch (Exception e) {
            e.printStackTrace();
        }
		
		return null;
       
//        System.out.println(obj.getClass().getDeclaredMethod("get"+upperFirstStr(methodNames[0])).invoke(obj));
		
		
//		List<String> newList = new ArrayList<>();
//		for (int i = 0; i < 100; i++) {
//			doIt(newList);
//		}
//		System.out.println(newList);
//		
//		//取出全部西瓜
//		List<String> bList = StreamUtil.toPredicateList(newList, e -> e.contains("西瓜"));
//		System.out.println(bList);
//		
//		//取出西瓜的數字
//		List<String> aList = new ArrayList<>();
//		bList.forEach(o->aList.add(toInt(o)));
//		System.out.println(aList);
//		
//		TestA testA = ok(1L,"peter");
//		System.out.println(testA.getId()+testA.getName());
//		
//		TestA testA2 = ok(2L,"tomcat");
//		System.out.println(testA2.getId()+testA2.getName());
	}
	
	private static void doIt(List<String> newList){
		List<String> aList = Arrays.asList("\n普通品質","\n平凡品質","\n優良品質","\n精選品質","\n完美品質");
		newList.add(aList.get(random(0,aList.size()-1)));
		
		aList = Arrays.asList(
				"蘋果"+random(4,6)+"個","梨"+random(4,6)+"個","香蕉"+random(4,6)+"個","哈密瓜"+random(4,6)+"個",
				"西紅柿"+random(2,4)+"個","榴蓮"+random(2,4)+"個","水蜜桃"+random(6,8)+"個","櫻桃"+random(10,30)+"個",
				"西瓜"+random(5,10)+"個","李子"+random(10,20)+"個","橘子"+random(6,8)+"個");
		newList.addAll(subListRandom(aList,random(2,4)));
	}
	
	//字符串提取數字
	private static String toInt(String str) {
		return StringUtils.join(StreamUtil.toList(Arrays.asList(str.split("")),StringUtils::isNumeric,Integer::valueOf),"");
	}
	
	//得到隨機數(隨機參數a到參數b的數字)
	private static int random(int a,int b){
		return RandomUtils.nextInt(a, b+1);
	}
	
	//隨機取出數組中的值
	private static List<String> subListRandom(List<String> aList,int random){
		//隨機(數組數量-隨機數)=起始位
		int fromIndex = random(0,aList.size() - random);
		//起始位+隨機數=結束位
		int toIndex = fromIndex + random;
		//取出數組中[起始位(包括)]到[結束位(不包括)]的值
		return aList.subList(fromIndex,toIndex);
	}
	
}
package com.haizol.mk.rfq;

public class TestB {
	
	private long id;
	
	private long num;
	

	public long getNum() {
		return num;
	}

	public void setNum(long num) {
		this.num = num;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
	
}
package com.haizol.mk.rfq;

public class TestA{
	 
}
相關文章
相關標籤/搜索