第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java 反射:怎么取出類的泛型類型

Java 反射:怎么取出類的泛型類型

慕妹3242003 2019-03-14 15:11:08
[code="java"]public class BaseHello {private Class entityClass; public BaseHello(){      //entityClass怎么賦值?(怎么能知道entityClass就是代表Personal這個(gè)類?)  }}[/code][code="java"]public static void main(String[] args) {BaseHello pdao = new BaseHello();System.out.println(pdao);}[/code]如注釋的問題:在BaseHello的構(gòu)造方法中,怎么給entityClass賦值?
查看完整描述

7 回答

?
森欄

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊

ParameterizedType parameterizedType = (ParameterizedType)this.getClass().getGenericSuperclass();

entityClass= (Class)(parameterizedType.getActualTypeArguments()[0]);


查看完整回答
反對(duì) 回復(fù) 2019-04-26
?
BIG陽

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]

你看下這樣獲取是否是你要的


查看完整回答
反對(duì) 回復(fù) 2019-04-26
?
烙印99

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]


查看完整回答
反對(duì) 回復(fù) 2019-04-26
?
動(dòng)漫人物

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 {
    }
}

}


查看完整回答
反對(duì) 回復(fù) 2019-04-26
?
桃花長相依

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è)地方你曉得怎么賦值了吧?

}

}


查看完整回答
反對(duì) 回復(fù) 2019-04-26
?
眼眸繁星

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); }


查看完整回答
反對(duì) 回復(fù) 2019-04-26
  • 7 回答
  • 0 關(guān)注
  • 1486 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)