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{ }