7 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
ParameterizedType parameterizedType = (ParameterizedType)this.getClass().getGenericSuperclass();
entityClass= (Class)(parameterizedType.getActualTypeArguments()[0]);

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
可以看下這個(gè),這是rapid-framework通用框架,里面有講Base,
[code="java"]public class UserDao extends BaseHibernateDao{
@Override public Class getEntityClass() { return User.class; }
}[/code]
你看下這樣獲取是否是你要的

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
不要再糾結(jié)這個(gè)問題了,這個(gè)沒有解決方案,曾經(jīng)和你一樣的想法,記不清哪兒看的了,這個(gè)牽涉到泛型的擦除遠(yuǎn)離。
大意是:
1. 泛型編譯時(shí)會(huì)推導(dǎo)擦除
2. 只有在編譯時(shí)保存了類型信息時(shí)才能獲得,運(yùn)行時(shí)的泛型信息因?yàn)轭愋筒脸钥隙ǐ@取不到泛型的具體信息
詳細(xì)測(cè)試見:
[code="java"]
public class TypesTest extends TestCase {
Map a;
Inner b;
List[][]> c;
List d;
Set e;
Outer.Inner f;
private ParameterizedType mapStringInteger; private ParameterizedType innerFloatDouble; private ParameterizedType listSetStringArray; private ParameterizedType listString; private ParameterizedType setString; private ParameterizedType outerInner; private GenericArrayType setStringArray; @Override protected void setUp() throws Exception { super.setUp(); mapStringInteger = (ParameterizedType) getClass().getDeclaredField("a") .getGenericType(); innerFloatDouble = (ParameterizedType) getClass().getDeclaredField("b") .getGenericType(); listSetStringArray = (ParameterizedType) getClass().getDeclaredField( "c").getGenericType(); listString = (ParameterizedType) getClass().getDeclaredField("d") .getGenericType(); setString = (ParameterizedType) getClass().getDeclaredField("e") .getGenericType(); outerInner = (ParameterizedType) getClass().getDeclaredField("f") .getGenericType(); setStringArray = (GenericArrayType) listSetStringArray .getActualTypeArguments()[0]; System.out.println(UtilJson.getObjectMapper() .writerWithType(TypesTest.class).writeValueAsString(this)); ; } class Inner<T1, T2> { } static class Outer<T> { class Inner { } }
}
[/code]

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
因?yàn)轭惖某蓡T變量在編譯時(shí)會(huì)保留其類型信息的。
如下E是泛型類型,Set e,在類型推導(dǎo)時(shí)會(huì)替換為Object的,所以你無法獲取到類型信息,而e2,定義時(shí)就包含了類型信息,故可以獲取到。
[code="java"]
public class TypesTest {
Set e;
Set e2;
}
[/code]
完整測(cè)試代碼如下
[code="java"]
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class TypesTest {
Map a;
Inner b;
List[][]> c;
List d;
Set e;
Outer.Inner f;
private ParameterizedType mapStringInteger; private ParameterizedType innerFloatDouble; private ParameterizedType listSetStringArray; private ParameterizedType listString; private ParameterizedType setString; private ParameterizedType outerInner; private GenericArrayType setStringArray; private String toString(ParameterizedType parameterizedType) { Type[] types = parameterizedType.getActualTypeArguments(); String ret = "\n\t" + parameterizedType + "\n\t\t泛型個(gè)數(shù):" + types.length + "==>"; for (Type type : types) { ret += type + ", "; } return ret; } @Test public void main() throws Exception { mapStringInteger = (ParameterizedType) getClass().getDeclaredField("a").getGenericType(); innerFloatDouble = (ParameterizedType) getClass().getDeclaredField("b").getGenericType(); listSetStringArray = (ParameterizedType) getClass().getDeclaredField("c").getGenericType(); listString = (ParameterizedType) getClass().getDeclaredField("d").getGenericType(); setString = (ParameterizedType) getClass().getDeclaredField("e").getGenericType(); outerInner = (ParameterizedType) getClass().getDeclaredField("f").getGenericType(); setStringArray = (GenericArrayType) listSetStringArray.getActualTypeArguments()[0]; System.out.println("a Map<String, Integer> 推導(dǎo)擦除后類型信息:" + toString(mapStringInteger)); System.out.println(); System.out.println("b Inner<Float, Double> 推導(dǎo)擦除后類型信息:" + toString(innerFloatDouble)); System.out.println(); System.out.println("c List<Set<String>[][]> 推導(dǎo)擦除后類型信息:" + toString(listSetStringArray)); System.out.println(); System.out.println("d List<String> 推導(dǎo)擦除后類型信息:" + toString(listString)); System.out.println(); System.out.println("e Set<String> 推導(dǎo)擦除后類型信息:" + toString(setString)); System.out.println(); System.out.println("f Outer<String>.Inner 推導(dǎo)擦除后類型信息:" + toString(outerInner)); System.out.println(); System.out.println("c List<Set<String>[][]> List第二層Set的泛型推導(dǎo)信息:" + setStringArray); } class Inner<T1, T2> { } static class Outer<T> { class Inner { } }
}

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊
你調(diào)用的無參的構(gòu)造函數(shù):
BaseHello pdao = new BaseHello();
相當(dāng)于變成了這樣:
[code="java"]
public class BaseHello {
private Personal entityClass;
public BaseHello(){ //entityClass怎么賦值?(怎么能知道entityClass就是代Personal這個(gè)類?) 你覺得這個(gè)地方你能怎么賦值?參數(shù)都不帶!你想給entityClass賦值,就需要用帶參數(shù)的構(gòu)造函數(shù)。簡單的事情不要整復(fù)雜了。 } public BaseHello(Class<T> arg){ 這個(gè)地方你曉得怎么賦值了吧?
}
}

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
反射工具類
*/
@SuppressWarnings("unchecked")
public class ReflectUtils {/**
/**
public PojoRawMapper() {
entityClass = ReflectUtils.getClassGenricType(getClass());
}根據(jù)索引獲得超類的參數(shù)類型
@param clazz 超類類型
@param index 索引 */ @SuppressWarnings("rawtypes") public static Class getClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { return Object.class; } Type[] params = ((ParameterizedType)genType).getActualTypeArguments(); if (index >= params.length || index < 0) { return Object.class; } if (!(params[index] instanceof Class)) { return Object.class; } return (Class) params[index]; } } [/code] [code="java"] public class PojoRawMapper implements RowMapper{ protected Class entityClass;
獲得超類的參數(shù)類型,取第一個(gè)參數(shù)類型
@param 類型參數(shù)
@param clazz 超類類型 */ @SuppressWarnings("rawtypes") public static Class getClassGenricType(final Class clazz) { return getClassGenricType(clazz, 0); }
添加回答
舉報(bào)