jdk1.5開始支持泛型,所以我們有時(shí)需要把泛型里定義的對(duì)象的類型拿到,研究了一下sample代碼 可以這樣來做 比如現(xiàn)在我定義了三個(gè)類Account, AccountItem和Product類。 Account聚合AccountItem,AccountItem聚合Prodcut。 都是用List<AccountItem>和List<Product>來表示的 我要實(shí)現(xiàn)一個(gè)功能,需要動(dòng)態(tài)的傳入一個(gè)Class的類型,然后反射到啟動(dòng)的List,根據(jù)List里定義的泛型,知道其中List的具體對(duì)象。 這個(gè)需求主要是由于現(xiàn)在的Json-lib還不支持深度的List的unmarshall,而只支持?jǐn)?shù)組的方式。其實(shí)這里就是json-lib的beanfactory用到ezmorpher,而ezmorpher不支持泛型的定義方式,所以不知道類型,全轉(zhuǎn)成MorpherDynBean,這樣的對(duì)象是我們不需要的。 這樣需要修改ezmorpher的代碼,注入自己的MorpherBean的processor,這個(gè)processor就根據(jù)泛型拿到,我們需要轉(zhuǎn)型的對(duì)象。 代碼片段如下
引用: Field[] fs = clazz.getDeclaredFields(); // 得到所有的fields for(Field f : fs) if(fieldClazz.isPrimitive()) continue; //【1】 //判斷是否為基本類型 if(fieldClazz.getName().startsWith("java.lang")) continue; //getName()返回field的類型全路徑; if(fieldClazz.isAssignableFrom(List.class)) //【2】 if(fc == null) continue; if(fc instanceof ParameterizedType) // 【3】如果是泛型參數(shù)的類型 Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //【4】 得到泛型里的class類型對(duì)象。 m.put(f.getName(), genericClazz); Map<String, Class> m1 = prepareMap(genericClazz); m.putAll(m1);
【解釋】: 1、isPrimitive public boolean isPrimitive() Class 對(duì)象是否表示一個(gè)基本類型。有九種預(yù)定義的 這些對(duì)象僅能通過下列聲明為 public static final 的變量訪問,也是使此方法返回
AA.class.isAssignableFrom(BB.class)的作用是判定AA表示的類或接口是否同參數(shù)BB指定的類表示的類或接口相同,或AA是否是BB的父類。 eg: System.out.println( String.class.isAssignableFrom(Object.class) ) ; false 3、ParameterizedType 表示參數(shù)化類型,如 Collection<String>。 4、getGenericSuperclass, getSuperclass, getActualTypeArguments 說明 1.Class<? super T> getSuperclass():返回本類的父類 2.Type getGenericSuperclass():返回本類的父類,包含泛型參數(shù)信息 例子 1.ClassA.java
2.Test.java
輸出結(jié)果: ======getSuperclass======: ClassA ======getGenericSuperclass======: ClassA<T> ----------->getActualTypeArguments:T, |
|