1. 程式人生 > >獲取泛型類的真實引數

獲取泛型類的真實引數

獲得某個類的泛型

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