獲取泛型類的真實引數
獲得某個類的泛型
輸出:package com; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.springframework.core.ResolvableType; interface Service2<N, M> { } class ABService2 implements Service2<A, B> {} public class TestGenericClass2 { private Service<C, D> cdService; public static void main(String[] args) { //獲取ABService2實現的第一個介面(從0開始計數) 即Service2<A, B> ParameterizedType parameterizedType = (ParameterizedType) ABService2.class.getGenericInterfaces()[0]; System.out.println(parameterizedType); //從Service2<A, B> 獲得第0個引數 即A Type genericType = parameterizedType.getActualTypeArguments()[0]; System.out.println(genericType); System.out.println("*************"); //下面的可以獲得被aop代理之前的型別 //ClassUtils.getUserClass(myClass); ResolvableType resolvableType1 = ResolvableType.forClass(ABService2.class); Class c=resolvableType1.as(Service2.class).getGeneric(0).resolve(); Class d=resolvableType1.getInterfaces()[0].getGeneric(0).resolve(); System.out.println("c "+c); System.out.println("d "+d); //上面的c與d一樣 說明resolvableType1.as(Service2.class)與resolvableType1.getInterfaces()[0] //是一樣的 都是返回resolvableType1 實現的某個介面 System.out.println("__________"); } }
com.Service2<com.A, com.B>
class com.A
*************
c class com.A
d class com.A
---------------
上面程式碼裡,*************之前的是使用jdk的原始api,之後是使用spring為我們通過的泛型api
使用jdk原始的api,似乎有個問題,那就是如果,如果目標類是繼承(而不是實現)了某個泛型類,那就(似乎)沒法獲得引數型別了
(這個,我也不確定,如果諸位誰知道,麻煩告訴小弟一聲)
輸出package com; import org.springframework.core.ResolvableType; interface Service3<N, M> {} class ServiceImpl3<N,M> implements Service<N, M>{} class C3 {} class D3 {} class CDService3 extends ServiceImpl<C3, D3> {} public class TestGenericClass3 { public static void main(String[] args) { ResolvableType resolvableType1 = ResolvableType.forClass(CDService3.class); Class c=resolvableType1.as(ServiceImpl.class).getGeneric(0).resolve(); System.out.println("c "+c); } }
c class com.C3
***********
獲得成員變數的泛型型別
輸出:package com; import org.springframework.core.ResolvableType; import org.springframework.util.ReflectionUtils; interface Service4<N, M> {} class ServiceImpl4<N,M> implements Service<N, M>{} class C4 {} class D4 {} class CDService4 extends ServiceImpl4<C4, D4> { } public class TestGenericClass4 { private Service<C, D> cdService; public static void main(String[] args) { ResolvableType resolvableType2 = ResolvableType.forField(ReflectionUtils.findField(TestGenericClass.class, "cdService")); System.out.println(resolvableType2.getGeneric(0).resolve()); } }
class com.C
在含泛型的父類中,獲得子類的引數
說的很模糊,大家看程式碼:package com;
import org.springframework.core.ResolvableType;
import org.springframework.util.ClassUtils;
interface Service<N, M> {
}
class ServiceImpl<N,M> implements Service<N, M>{
private Class<?> entityN;
private Class<?> entityM;
public ServiceImpl(){
System.out.println("this is "+this.getClass());
//用於避過aop 獲得原始的型別
Class<?> childClass=ClassUtils.getUserClass(this.getClass());
if (childClass.equals(this.getClass())) {
System.out.println("一樣");
}
ResolvableType resolvableType1 = ResolvableType.forClass(childClass);
entityN=resolvableType1.as(ServiceImpl.class).getGeneric(0).resolve();
entityM=resolvableType1.as(ServiceImpl.class).getGeneric(1).resolve();
System.out.println(entityN+" ** "+entityM);
}
}
class A {}
class B {}
class ABService extends ServiceImpl<A, B> {
}
public class TestGenericClass {
public static void main(String[] args) {
Service<A, B> abService= (Service<A, B>) new ABService();
System.out.println("************* "+abService);
}
}
輸出this is class com.ABService
一樣
class com.A ** class com.B
************* [email protected]
關於更多的泛型資料,請見參考資料
順便多說一句,開濤哥真牛。
感謝glt。
參考資料
http://jinnianshilongnian.iteye.com/blog/1993608相關推薦
獲取泛型類的真實引數
獲得某個類的泛型 package com; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.springframework.core.Resol
180530-反射獲取泛型類的實際參數
sys party params 情況下 imp upload sbo 如果 type() 文章鏈接:https://liuyueyi.github.io/hexblog/2018/05/30/180530-通過反射獲取泛型類的實際參數/ 反射獲取泛型類的實際參數 泛型用得
【C#】獲取泛型的真實型別
需求:在包含泛型T的類或方法中,想要根據T的具體型別,進行相應的處理,需求虛擬碼如下: public void Test<T>() { if(T is string)
【java】如何通過反射獲取泛型類
核心程式碼:(編寫在父類中) public class BaseDaoImpl<T> implements BaseDao<T> { private Class<
通過java反射技術獲取泛型的真實型別並對其例項化
public DaoBaseInterfaceImpl() { // 反射得到T的真實型別 ParameterizedType ptype = (ParameterizedType) thi
java反射獲取泛型類
public class Person<T> { } import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Student ext
(繼承方式)反射獲取泛型類的型別和物件
1.工具類,用於獲取泛型類的型別和物件public abstract class FatherReflectUtils<T> { public T getTInstance() th
獲取運行時的泛型類型
getc log 父類 nds hiberna gen generic type nts public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
怎麼獲取泛型T.class類?
public <T> void get(List<T> list){ getA(T.class); //報錯,不能呼叫T.class } public void getA(Class<?> class){ } 如上程式碼,要呼叫getA
Android:Gson通過藉助TypeToken獲取泛型引數的型別的方法
最近在使用Google的Gson包進行Json和Java物件之間的轉化,對於包含泛型的類的序列化和反序列化Gson也提供了很好的支援,感覺有點意思,就花時間研究了一下。 由於Java泛型的實現機制,使用了泛型的程式碼在執行期間相關的泛型引數的型別會被擦除,我們無法在執行期間獲
過載和覆蓋的區別,通過反射獲取泛型實際型別,列舉要點,五個最常用的集合類之間的區別和聯絡,final總結
java面試碰到過的題目之方法過載和覆蓋的區別。 1. 過載方法必須滿足以下條件: i. 方法名相同。 ii. 方法的引數型別、個數、順序至少有一項不同。 iii. 方法的返回型別可以不相同。 iv. 方法的修飾符可以不相同。 2. 重寫方法必須滿足以下條件: i. 子
java 獲取 泛型型別(介面及超類)
package generic.portal; /** * Created by Administrator on 2017/1/10. */ public interface GenericInterface<T> { } package gener
Java 之路 (十五) -- 泛型上(泛型類、泛型方法、有界型別引數、泛型與繼承、型別推斷)
Thinking in Java 中關於泛型的講解篇幅實在過長,前後嘗試閱讀這一章,但總是覺得找不到要點,很迷。於是放棄 Thinking in Java 泛型一章的閱讀,轉而官方教程,本章可以算作官方教程的中文版。 1.為什麼使用泛型 簡單來說
泛型類獲取泛型型別
1.再使用jdbcTemplate時有個query(sql, new RowMapper<User>(){} )方法,返回實體物件列表; List<User> list = jdbcTemplate.query(sql, new RowMapper&
Java如何獲得泛型類的真實型別
public class RealType<T>{ private Class<T> clazz; // 使用反射技術得到T的真實型別 public Class g
在base類中獲取泛型的型別和泛型物件
class A<T,S> { //獲取S的class public Class<T> poClass = (Class<T>) (((ParameterizedType) this.getClass().getGeneric
反射獲取泛型真實型別
<pre name="code" class="java">public class Animal<T> { } import java.lang.reflect.Para
通過反射來獲取泛型的實際泛型引數
//Vector<Date> v1 = new Vector<Date>(); Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class); Type[]
java 反射之獲取泛型對象的所有字段與對應的值(包括父類的)
date lse 代碼 out lda ble alt http info 上代碼: public static void main(String[] args) throws IntrospectionException { SysUser obj =
代碼清單3-6 表示一對值泛型類
string har static private clas logs tab div ole using System; using System.Collections.Generic; using System.Linq; using System.Text; n