电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 反射類型Type的用法說明

瀏覽:112日期:2022-08-12 13:39:32
各個方法1. 得到class的成員變量

首先得到object的class對象

然后在class對象中用getDeclaredFields()方法來獲得class的成員變量

FieldTest ft = new FieldTest();Class ftClass = ft.getClass();Field[] fields = ftClass.getDeclaredFields();2. field的函數

Field對象有很多成員方法

getName()獲取名稱。

getGenericType() 返回一個Type對象

getType() 返回Class對象

getGenericType 和getType區別:

返回類型一個是Class對象一個是Type接口。

如果屬性是泛型,getType()返回屬性的接口類型。getGenericType()還能返回參數類型。

String fieldName = field.getName();Type genericType = field.getGenericType();boolean isParameterizedType = (genericType instanceof ParameterizedType);Class fieldClazz = field.getType();String valueTypeName = genericType.getTypeName();3.獲取范型的Type和Class

獲取 范型的key和value的Type

Type[] genericTypes = ((ParameterizedType) genericType).getActualTypeArguments();Type type0 = genericTypes[0];Type type1 = genericTypes[1];

通過google的com.google.common.reflect.TypeToken.of(type1).getRawType()方法獲取map的key或者value的class類型。

Class<?> clazz = com.google.common.reflect.TypeToken.of(type1).getRawType();總代碼

class FieldTest { private String pri; protected String pro; public Map<Integer, HashMap<Integer, Float>> fcmap; public FieldTest() { } public FieldTest(String pri, String pro, String pub) {this.pri = pri;this.pro = pro; }}

package cn.hyperchain.hvm.abi;import java.lang.reflect.Array;import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.Arrays;import java.util.HashMap;import java.util.Map;public class Test { private static boolean checkClazzIsSpecific(Class CClazz, Class specific) {if (CClazz == specific) return true;Class[] interfaces = CClazz.getInterfaces();boolean result = false;for (Class inter : interfaces) { if (result) break; if (inter == specific) {result = true;break; } result = checkClazzIsSpecific(inter, specific);}return result; } public static void main(String args[]) {FieldTest ft = new FieldTest();Class ftClass = ft.getClass();Field[] fields = ftClass.getDeclaredFields();for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); Type genericType = field.getGenericType(); Class fieldClass = field.getClass(); boolean isParameterizedType = (genericType instanceof ParameterizedType); Class fieldClazz = field.getType(); String valueTypeName = genericType.getTypeName(); System.out.println(); System.out.println('-------------------------------------------------'); System.out.println(); System.out.println('fieldName: ' + fieldName); System.out.println('genericType: ' + genericType); System.out.println('fieldClazz: ' + fieldClazz); System.out.println('isParameterizedType: ' + isParameterizedType); System.out.println('valueTypeName: ' + valueTypeName); if (checkClazzIsSpecific(fieldClazz, Map.class)) {Type[] genericTypes = ((ParameterizedType) genericType).getActualTypeArguments();Type type0 = genericTypes[0];Type type1 = genericTypes[1];String type1Name = genericTypes[1].getTypeName();System.out.println('type0: ' + type0);System.out.println('type1: ' + type1);System.out.println('type1Name: ' + type1Name);System.out.println(type1 instanceof ParameterizedType);Type type3 = ((ParameterizedType)type1).getOwnerType();Class type4 = type1.getClass();//Class<?> type5 = (Class<?>) type1;System.out.println('type3: ' + type3);System.out.println('type4: ' + type4);//System.out.println(type5);Class<?> clazz = com.google.common.reflect.TypeToken.of(type1).getRawType();System.out.println('clazz: ' + clazz); }} }}class FieldTest { private String pri; protected String pro;// public Map<String, Integer> map; public Map<Integer, HashMap<Integer, Float>> fcmap; public FieldTest() { } public FieldTest(String pri, String pro, String pub) {this.pri = pri;this.pro = pro; }}class abc { private String pri; protected String pro; public String pub; public String[] string; public int[] innt; public Map<String, Integer> map; public abc() { } public abc(String pri, String pro, String pub) {this.pri = pri;this.pro = pro;this.pub = pub; }}結果:

-------------------------------------------------

fieldName: prigenericType: class java.lang.StringfieldClazz: class java.lang.StringisParameterizedType: falsevalueTypeName: java.lang.String

-------------------------------------------------

fieldName: progenericType: class java.lang.StringfieldClazz: class java.lang.StringisParameterizedType: falsevalueTypeName: java.lang.String

-------------------------------------------------

fieldName: fcmapgenericType: java.util.Map<java.lang.Integer, java.util.HashMap<java.lang.Integer, java.lang.Float>>fieldClazz: interface java.util.MapisParameterizedType: truevalueTypeName: java.util.Map<java.lang.Integer, java.util.HashMap<java.lang.Integer, java.lang.Float>>type0: class java.lang.Integertype1: java.util.HashMap<java.lang.Integer, java.lang.Float>type1Name: java.util.HashMap<java.lang.Integer, java.lang.Float>truetype3: nulltype4: class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImplclazz: class java.util.HashMap

Process finished with exit code 0

補充:Java-使用反射獲取類型信息

Java中如何使用反射獲取類型信息?

最近寫了大量需要根據類屬性的類型反射注入值的代碼,總結了以下常用的反射技巧:

一個簡單類的例子

在這個類中,有普通的String類型,有數組類型,有帶泛型的List類型,有嵌套List類型,以及有多個泛型參數的簡單類,這個類將作為我們后面的內容的基礎。我們這一次博客解析如何使用反射獲取到不同屬性的類型值。

public class Some{ private String name; private Integer[] numbers; private List<String> list; private List<List<Double>> matrix; private Map<String,Class> map; //ignore getter and setter}分析如何獲取不同屬性的類型1、普通類型

普通類型的變量直接field.getType()即可以獲取到他們的類型

public void queryNameType() throws NoSuchFieldException { Field field = Some.class.getDeclaredField('name'); Class<?> type = field.getType(); assertEquals(type,String.class);}2、數組類型

數組類型不像其他的類型可以通過isAssignableFrom()函數來進行判斷,他需要使用isArray() 來判斷該type是否是一個數組類型,然后使用getComponentType() 獲取他的元素的類型

public void queryArrayType() throws NoSuchFieldException { Field field = Some.class.getDeclaredField('numbers'); Class<?> type = field.getType(); //一般來說,判斷是否是某種類型是可以使用isAssignableFrom // 判斷是否是數組類型比較特殊,要使用isArray()這個函數 if (type.isArray()){//獲得數組的類型,使用getComponentType()這個方法Class<?> componentType = type.getComponentType();assertEquals(componentType,Integer.class); } else{throw new IllegalStateException(); }}3、帶泛型的類型

帶泛型的類型就是類似于List<String>這樣的類型,我們現在的任務就是獲取到String這個類型。

ParameterizedType表示參數化的類型,例如Collection這樣的類型。我們可以通過getGenericType()方法獲得該子類,當你的類型帶有參數的時候就會返回ParameterizedType,否則會返回普通的類型(class)

那么具體是怎么操作的呢?

以獲得List<T>的類型為例子

public void getListType() throws NoSuchFieldException { Field field = Some.class.getDeclaredField('list'); //如果類似于List<String>這樣的類型就是一種GenericType //注意這是一種Type類型 Type type = field.getGenericType(); if (type instanceof ParameterizedType){//泛型參數類型ParameterizedType parameterizedType = (ParameterizedType)type;Type[] actualTypes = parameterizedType.getActualTypeArguments();//因為List<String>獲得第一個泛型參數,因為只有一個,我們取第一個//如果我們有多個泛型參數,我們可以根據順序取不同的泛型參數assertEquals(actualTypes[0],String.class);//如果獲得List這個原始類型呢?assertEquals(parameterizedType.getRawType(),List.class); }else{throw new IllegalStateException(); }}4、復雜的嵌套類型

假如是List<List<String>> 如何獲得最里面的類型呢?

例子如下

public void getSubListType() throws NoSuchFieldException { //思考一下,如果我們有一個嵌套List,我們想拿到嵌套在最里面的類型,那么我們可以這么做呢? //其實我們可以使用遞歸的思想去獲得最里面的類型 Field field = Some.class.getDeclaredField('matrix'); assertEquals(getBaseType(field.getGenericType()),Double.class); } public static Type getBaseType(Type genericReturnType){ Objects.requireNonNull(genericReturnType); if (genericReturnType instanceof ParameterizedType && List.class.isAssignableFrom((Class)(((ParameterizedType) genericReturnType).getRawType()))){ Type[] actualTypeArguments = ((ParameterizedType)genericReturnType).getActualTypeArguments(); Type type = actualTypeArguments[0]; return getBaseType(type); }else{ return genericReturnType; } }5、多個泛型參數

與第三個例子相似,只需要使用actualTypes數組按順序取即可

例子如下

public void getMapType() throws NoSuchFieldException { Field field = Some.class.getDeclaredField('map'); Type type = field.getGenericType(); if (type instanceof ParameterizedType){ParameterizedType parameterizedType = (ParameterizedType)type;Type[] actualTypes = parameterizedType.getActualTypeArguments();assertEquals(actualTypes[0],String.class);assertEquals(actualTypes[1],Class.class); }else{throw new IllegalStateException(); }}總結

以上總結了幾種常用的使用反射獲取屬性類型的例子,稍加改造就可以寫自己的工具類了。希望對大家有幫助^_^

標簽: Java
相關文章:
主站蜘蛛池模板: 南方珠江-南方一线电缆-南方珠江科技电缆-南方珠江科技有限公司 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 大学食堂装修设计_公司餐厅效果图_工厂食堂改造_迈普装饰 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 工业用品一站式采购平台|南创工品汇-官网|广州南创 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 泰州物流公司_泰州货运公司_泰州物流专线-东鑫物流公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 压缩空气冷冻式干燥机_吸附式干燥机_吸干机_沪盛冷干机 | 至顶网| 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 外贸资讯网 - 洞悉全球贸易,把握市场先机 | 智能楼宇-楼宇自控系统-楼宇智能化-楼宇自动化-三水智能化 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 安徽控制器-合肥船用空调控制器-合肥家电控制器-合肥迅驰电子厂 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | IP检测-检测您的IP质量 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 |