package com.litesuits.orm.test; import com.litesuits.orm.db.annotation.MapCollection; import com.litesuits.orm.db.utils.ClassUtil; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingDeque; /** * @author MaTianyu * @date 14-4-29 */ public class TestNewInstance { public static void main(String[] args) { try { Field absList = A.class.getDeclaredField("absList"); Class c1 = absList.getType(); Class c2 = (Class) ((ParameterizedType) absList.getGenericType()).getActualTypeArguments()[0]; System.out.println("容器类型: " + c1); System.out.println("承载类: " + c2); A a = new A(); absList.set(a, ClassUtil.newCollectionForField(absList)); Collection ca = a.absList; ca.add("hello "); ca.add(" a test "); System.out.println(a); System.out.println("------------------\n\n"); Field ab = A.class.getDeclaredField("ab"); c1 = ab.getType(); c2 = (Class) ((ParameterizedType) ab.getGenericType()).getActualTypeArguments()[0]; System.out.println("容器类型: " + c1); System.out.println(Collection.class.isAssignableFrom(c1)); System.out.println(c1.isAssignableFrom(Collection.class)); System.out.println("承载类: " + c2); ab.set(a, c1.newInstance()); ca = a.ab; ca.add(c2.newInstance()); ca.add(c2.newInstance()); System.out.println(a); System.out.println("------------------\n\n"); Field ac = A.class.getDeclaredField("ac"); c1 = ac.getType(); c2 = ac.getType().getComponentType(); System.out.println("容器类型: " + c1); System.out.println(c1.isArray()); System.out.println(Collection.class.isAssignableFrom(c1)); System.out.println("承载类: " + c2); System.out.println(ac.getType().getComponentType()); //Constructor cons = c1.getConstructor(int.class); //System.out.println("cons : " + cons); //ac.set(a, cons.newInstance(2)); C o1 = (C) c2.newInstance(); C o2 = (C) c2.newInstance(); Object array = Array.newInstance(c2, 10); Array.set(array, 0, o1); Array.set(array, 1, o2); ac.set(a, array); Object[] oa = a.ac; System.out.println("A is : " + a); System.out.println("------------------\n\n"); Field cc = A.class.getDeclaredField("cc"); c1 = cc.getType(); c2 = (Class) ((ParameterizedType) cc.getGenericType()).getActualTypeArguments()[0]; System.out.println("容器类型: " + c1); System.out.println(Collection.class.isAssignableFrom(c1)); System.out.println("承载类: " + c2); cc.set(a, c1.newInstance()); ca = a.cc; ca.add(c2.newInstance()); ca.add(c2.newInstance()); System.out.println(a); System.out.println("------------------\n\n"); List<C> l = new ArrayList<C>(); l.add(new C()); Collection cl = l; Type type = l.getClass().getGenericSuperclass(); System.out.println(((ParameterizedType) type).getActualTypeArguments()[0]); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 获取域的泛型类型,如果不带泛型返回null */ public static Class<?> getGenericType(Field f) { Type type = f.getGenericType(); if (type instanceof ParameterizedType) { type = ((ParameterizedType) type).getActualTypeArguments()[0]; if (type instanceof Class<?>) return (Class<?>) type; } else if (type instanceof Class<?>) return (Class<?>) type; return null; } public static class A { @MapCollection(LinkedList.class) List<String> absList; C[] ac; ArrayList<B> ab; LinkedList<B> bl; Vector<B> vb; ConcurrentLinkedQueue<C> cc; LinkedBlockingDeque<C> lc; @Override public String toString() { return "A{" + "absList=" + absList + ", ac=" + Arrays.toString(ac) + ", ab=" + ab + ", bl=" + bl + ", vb=" + vb + ", cc=" + cc + ", lc=" + lc + '}'; } } public static class B { @Override public String toString() { return "b"; } } public static class C { @Override public String toString() { return "c"; } } }