中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

反射處理java泛型
來源:易賢網(wǎng) 閱讀:2232 次 日期:2015-04-10 14:14:37
溫馨提示:易賢網(wǎng)小編為您整理了“反射處理java泛型”,方便廣大網(wǎng)友查閱!

當(dāng)我們聲明了一個(gè)泛型的接口或類,或需要一個(gè)子類繼承至這個(gè)泛型類,而我們又希望利用反射獲取這些泛型參數(shù)信息。這就是本文將要介紹的ReflectionUtil就是為了解決這類問題的輔助工具類,為java.lang.reflect標(biāo)準(zhǔn)庫的工具類。它提供了便捷的訪問泛型對象類型(java.reflect.Type)的反射方法。

本文假設(shè)你已經(jīng)了解java反射知識,并能熟練的應(yīng)用。如果還不了解java反射知識,那么你可以先移步到Oracel反射課程,這可能是你開始學(xué)習(xí)反射的好起點(diǎn).

ReflectionUtil中包含以下幾種功能:

通過Type獲取對象class;

通過Type創(chuàng)建對象;

獲取泛型對象的泛型化參數(shù);

檢查對象是否存在默認(rèn)構(gòu)造函數(shù);

獲取指定類型中的特定field類型;

獲取指定類型中的特定method返回類型;

根據(jù)字符串標(biāo)示獲取枚舉常量;

ReflectionUtil下載地址.

通過Type獲取對象class

private static final String TYPE_NAME_PREFIX = "class ";

public static String getClassName(Type type) {

if (type==null) {

return "";

}

String className = type.toString();

if (className.startsWith(TYPE_NAME_PREFIX)) {

className = className.substring(TYPE_NAME_PREFIX.length());

}

return className;

}

public static Class<?> getClass(Type type)

throws ClassNotFoundException {

String className = getClassName(type);

if (className==null || className.isEmpty()) {

return null;

}

return Class.forName(className);

}

方法ReflectionUtil#getClass(Type)實(shí)現(xiàn)了從java.lang.reflect.Type獲取java.lang.Class對象名稱。這里利用了Type的toString方法獲取所在類型的class。如“class some.package.Foo”,截取后部分class名稱,在利用Class.forName(String)獲取class對象。

通過Type創(chuàng)建對象

public static Object newInstance(Type type)

throws ClassNotFoundException, InstantiationException, IllegalAccessException {

Class<?> clazz = getClass(type);

if (clazz==null) {

return null;

}

return clazz.newInstance();

}

方法ReflectionUtil#newInstance(Type type)實(shí)現(xiàn)根據(jù)Type構(gòu)造對象實(shí)例。在這里輸入的Type不能是抽象類、接口、數(shù)組類型、以及基礎(chǔ)類型、Void否則會(huì)發(fā)生InstantiationException異常。

獲取泛型對象的泛型化參數(shù)

首先假設(shè)我們有如下兩個(gè)對象:

public abstract class Foo<T> {

//content

}

public class FooChild extends Foo<Bar> {

//content

}

怎么獲取子類在Foo中傳入的泛型Class類型呢?

比較常用的做法有以下兩種:

強(qiáng)制FooChild傳入自己的class類型(這也是比較常用的做法):

public abstract class Foo<T> {

private Class<T> tClass;

public Foo(Class<T> tClass) {

this.tClass = tClass;

}

//content

}

public class FooChild extends Foo<Bar> {

public FooChild() {

super(FooChild.class);

}

//content

}

利用反射獲取:

public static Type[] getParameterizedTypes(Object object) {

Type superclassType = object.getClass().getGenericSuperclass();

if (!ParameterizedType.class.isAssignableFrom(superclassType.getClass())) {

return null;

}

return ((ParameterizedType)superclassType).getActualTypeArguments();

}

方法ReflectionUtil#getParameterizedTypes(Object)利用反射獲取運(yùn)行時(shí)泛型參數(shù)的類型,并數(shù)組的方式返回。本例中為返回一個(gè)T類型的Type數(shù)組。

為了Foo得到T的類型我們將會(huì)如下使用此方法:

...

Type[] parameterizedTypes = ReflectionUtil.getParameterizedTypes(this);

Class<T> clazz = (Class<T>)ReflectionUtil.getClass(parameterizedTypes[0]);

...

注意:

在java.lang.reflect.ParameterizedType#getActualTypeArguments() documentation:的文檔中你能看見如下文字:

in some cases, the returned array can be empty. This can occur. if this type represents

a non-parameterized type nested within a parameterized type.

當(dāng)傳入的對象為非泛型類型,則會(huì)返回空數(shù)組形式。

檢查對象是否存在默認(rèn)構(gòu)造函數(shù)

public static boolean hasDefaultConstructor(Class<?> clazz) throws SecurityException {

Class<?>[] empty = {};

try {

clazz.getConstructor(empty);

} catch (NoSuchMethodException e) {

return false;

}

return true;

}

方法ReflectionUtil#hasDefaultConstructor利用java.lang.reflect.Constructor檢查是否存在默認(rèn)的無參構(gòu)造函數(shù)。

獲取指定類型中的特定field類型

public static Class<?> getFieldClass(Class<?> clazz, String name) {

if (clazz==null || name==null || name.isEmpty()) {

return null;

}

name = name.toLowerCase();

Class<?> propertyClass = null;

for (Field field : clazz.getDeclaredFields()) {

field.setAccessible(true);

if (field.getName().equals(name)) {

propertyClass = field.getType();

break;

}

}

return propertyClass;

}

在某些情況下你希望利用已知的類型信息和特定的字段名字想獲取字段的類型,那么ReflectionUtil#getFieldClass(Class<?>, String)可以幫助你。ReflectionUtil#getFieldClass(Class<?>, String) 利用Class#getDeclaredFields()獲取字段并循環(huán)比較java.lang.reflect.Field#getName()字段名稱,返回字段所對應(yīng)的類型對象。

獲取指定類型中的特定method返回類型

public static Class<?> getMethodReturnType(Class<?> clazz, String name) {

if (clazz==null || name==null || name.isEmpty()) {

return null;

}

name = name.toLowerCase();

Class<?> returnType = null;

for (Method method : clazz.getDeclaredMethods()) {

if (method.getName().equals(name)) {

returnType = method.getReturnType();

break;

}

}

return returnType;

}

方法ReflectionUtil#getMethodReturnType(Class<?>, String)可以幫助你根據(jù)對象類型和方法名稱獲取其所對應(yīng)的方法返回類型。ReflectionUtil#getMethodReturnType(Class<?>, String)利用Class#getDeclaredMethods()并以java.lang.reflect.Method#getName()比對方法名稱,返回找到的方法的返回值類型(Method#getReturnType()).

根據(jù)字符串標(biāo)示獲取枚舉常量

@SuppressWarnings({ "unchecked", "rawtypes" })

public static Object getEnumConstant(Class<?> clazz, String name) {

if (clazz==null || name==null || name.isEmpty()) {

return null;

}

return Enum.valueOf((Class<Enum>)clazz, name);

}

方法ReflectionUtil#getEnumConstant(Class<?>, String)為利用制定的枚舉類型和枚舉名稱獲取其對象。這里的名稱必須和存在的枚舉常量匹配。

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:反射處理java泛型
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美三级日韩三级国产三级| 亚洲欧洲一区二区三区久久| 亚洲小视频在线观看| 国产性天天综合网| 国产精品免费在线| 国产精品白丝av嫩草影院| 欧美激情一区在线| 欧美精品一区三区在线观看| 麻豆免费精品视频| 另类亚洲自拍| 欧美激情久久久| 欧美激情中文不卡| 欧美日韩一级片在线观看| 欧美日韩一区二区精品| 欧美日韩国产色站一区二区三区| 欧美理论在线播放| 欧美日韩综合久久| 国产精品人人爽人人做我的可爱 | 一本一本a久久| 欧美激情免费在线| 亚洲午夜精品| 欧美亚洲视频在线看网址| 久久精品99无色码中文字幕| 久久免费精品日本久久中文字幕| 久久野战av| 欧美全黄视频| 国产伦精品一区二区三区视频黑人| 国产精品一区三区| 一区在线免费观看| 亚洲美女在线国产| 亚洲一区在线免费观看| 欧美在线亚洲一区| 欧美激情一区| 国产精品一区一区| 亚洲国产成人在线| 一区二区三区四区五区精品视频| 午夜一区不卡| 麻豆免费精品视频| 国产精品国产三级国产| 激情综合电影网| 一区二区三区日韩精品| 欧美一级成年大片在线观看| 久久人人精品| 欧美午夜电影在线观看| 黄色精品一二区| 亚洲一区二区三区在线播放| 麻豆成人综合网| 国产精品入口| 日韩午夜在线观看视频| 久久久99国产精品免费| 欧美午夜在线一二页| 亚洲高清av| 久久精品盗摄| 国产精品亚洲不卡a| 亚洲美女尤物影院| 久久麻豆一区二区| 国产精品久久久久久av下载红粉 | 免费成人高清视频| 国产精品美女在线观看| 亚洲激情在线观看视频免费| 午夜亚洲影视| 欧美日韩在线第一页| 亚洲国产精品99久久久久久久久| 亚洲欧美三级伦理| 欧美三级特黄| 亚洲另类春色国产| 狼狼综合久久久久综合网| 国产精品一区二区久久国产| 99国产精品私拍| 欧美ed2k| 亚洲福利国产| 久久亚洲一区二区| 欧美日韩一二区| 欧美在线一区二区三区| 欧美日韩一区二区在线| 亚洲欧洲日韩综合二区| 老鸭窝亚洲一区二区三区| 国产欧美视频一区二区三区| 亚洲一区二区三区影院| 欧美日韩在线观看视频| 99re6热只有精品免费观看 | 蜜臀99久久精品久久久久久软件 | 久久久久久久综合狠狠综合| 欧美视频一区在线观看| 亚洲伦理在线观看| 欧美成人国产| 91久久精品日日躁夜夜躁国产| 久久综合图片| 亚洲高清视频在线| 噜噜噜噜噜久久久久久91| 亚洲国产精品成人久久综合一区| 久久综合影音| 亚洲日本成人| 欧美日韩精品一区二区| 一区二区三区 在线观看视| 欧美日韩在线播放三区| 亚洲校园激情| 国产精品三上| 久久av一区二区三区漫画| 国产日韩精品综合网站| 亚洲一区在线播放| 国产亚洲激情| 免费日韩成人| 99精品视频免费观看| 国产精品扒开腿做爽爽爽视频| 亚洲夜间福利| 国产综合18久久久久久| 欧美刺激午夜性久久久久久久| 亚洲裸体视频| 国产精品一区二区三区久久| 久久九九国产| 日韩午夜在线播放| 国产精品老女人精品视频| 欧美一区二视频在线免费观看| 狠狠久久综合婷婷不卡| 欧美高清在线一区| 亚洲综合视频一区| 伊人狠狠色j香婷婷综合| 欧美精品国产精品| 亚洲欧美日韩国产一区二区| 国内久久视频| 欧美精品激情在线观看| 亚洲欧美文学| 91久久国产综合久久蜜月精品| 欧美日韩少妇| 久久av一区二区三区漫画| 亚洲桃色在线一区| 国产一区二区三区奇米久涩 | 国产精品国产三级国产普通话三级| 亚洲在线视频| 亚洲国产毛片完整版| 国产精品久久久久久久久久免费看| 久久国产视频网| 日韩一二三在线视频播| 国产欧美大片| 欧美激情亚洲激情| 久久精品成人欧美大片古装| 亚洲欧洲日产国产网站| 国产日韩精品一区二区| 欧美日韩福利视频| 久久中文字幕导航| 亚洲欧美日韩综合aⅴ视频| 亚洲国产精品一区二区久| 国产精品普通话对白| 欧美精品在线观看一区二区| 久久九九国产精品怡红院| 亚洲一区三区电影在线观看| 亚洲欧洲日本在线| 激情小说另类小说亚洲欧美| 国产精品日日摸夜夜摸av| 欧美伦理影院| 欧美国产丝袜视频| 麻豆精品视频| 久久久久久尹人网香蕉| 亚洲一二三区在线观看| 亚洲伦理在线免费看| 亚洲国产欧美日韩另类综合| 国产真实久久| 国产综合精品| 国产真实久久| 黄色一区二区三区四区| 国产欧美亚洲日本| 国产精品蜜臀在线观看| 欧美午夜片在线免费观看| 欧美日韩亚洲国产一区| 欧美日本中文字幕| 欧美精品免费看| 欧美精品亚洲二区| 欧美伦理a级免费电影| 欧美激情精品久久久久久久变态| 久久婷婷成人综合色| 久久久人成影片一区二区三区| 欧美一区视频在线| 久久精品国产清高在天天线| 欧美影院视频| 久久亚洲视频| 欧美电影美腿模特1979在线看 | 老司机精品福利视频| 久久女同互慰一区二区三区| 久久精品国产久精国产爱| 久久久蜜桃精品| 蜜桃av综合| 最新中文字幕一区二区三区| 欧美日韩免费一区| 欧美午夜性色大片在线观看| 欧美三级电影网| 国产精品久久久久99| 国产精品一香蕉国产线看观看| 国产精品午夜在线| 国产真实乱子伦精品视频| 精品99一区二区| 亚洲破处大片| 亚洲一区日韩在线| 久久国产66| 欧美国产精品人人做人人爱| 欧美日韩精选| 国产乱理伦片在线观看夜一区| 国产综合色在线| 91久久夜色精品国产九色| 一本色道88久久加勒比精品|