Java反射操作泛型接口
2018-02-23 17:16
501 查看
通过反射获取到抽象类或者接口中泛型信息的操作也是很常见的。实际上开发中,解析后台数据的Json数据,生成对应的泛型实体类,会用到反射获取泛型信息的操作。
实战案例
大致思路:
1. 定义一个泛型的接口:
2. 定义一个实现类,用于获取指定具体的类型
3. 定义一个工具类:用于Type和Class之间的转换。
4. 定义一个实体类:用于指定泛型中实际类型
5. 程序入口
6. 运行结果如下:
本案例的项目代码: https://github.com/13767004362/JavaDemo/tree/master/ClassDemo
实战案例
大致思路:
getGenericInterfaces()获取到泛型接口的Type数组。
getActualTypeArguments()获取到泛型接口的实际类型。
1. 定义一个泛型的接口:
package com.xingen.classdemo.genericity; /** * Created by ${新根} on 2018/2/16 0016. * 博客:http://blog.csdn.net/hexingen * * 参考:https://www.cnblogs.com/whitewolf/p/4355541.html */ public interface GenericityInterface<K,T> { T doThing(K k); }
2. 定义一个实现类,用于获取指定具体的类型
package com.xingen.classdemo.genericity; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * Created by ${新根} on 2018/2/16 0016. * 博客:http://blog.csdn.net/hexingen * <p> * 反射获取泛型信息 */ public class GenericityInterfaceImp implements GenericityInterface<String, Bean> { //泛型中的两个类型 private Class<?> kClass,tClass; public GenericityInterfaceImp() { getGenericityMessage(GenericityInterfaceImp.class); } @Override public Bean doThing(String s) { return new Bean(s); } public void getGenericityMessage(Class<?> mClass) { try { //获取泛型接口 Type[] intefaceTypeArray = mClass.getGenericInterfaces(); if (intefaceTypeArray == null && intefaceTypeArray.length == 0) { return; } //获取实现的第一个接口类型 Type type = intefaceTypeArray[0]; if (!(type instanceof ParameterizedType)) { //这是Object类型 return; } //获取到实际的泛型中参数类型 Type[] parameterizedType = ((ParameterizedType) type).getActualTypeArguments(); kClass=TypeUtils.getClass(parameterizedType[0]); tClass=TypeUtils.getClass(parameterizedType[1]); }catch (Exception e){ e.printStackTrace(); } } public Class<?> getkClass() { return kClass; } public Class<?> gettClass() { return tClass; } public static GenericityInterfaceImp newInstance(){ return new GenericityInterfaceImp(); } }
3. 定义一个工具类:用于Type和Class之间的转换。
package com.xingen.classdemo.genericity; import java.lang.reflect.Type; /** * Created by ${新根} on 2018/2/16 0016. * 博客:http://blog.csdn.net/hexingen * * 通过Type获取对象class */ public class TypeUtils { 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); } }
4. 定义一个实体类:用于指定泛型中实际类型
public class Bean { private String work; public Bean() { } public Bean(String work) { this.work = work; } public String getWork() { return work; } public void setWork(String work) { this.work = work; } }
5. 程序入口
main(),运行:
public class Client { public static void main(String[] args) { useGenericity(); } /** * 反射泛型信息 */ public static void useGenericity(){ GenericityInterfaceImp imp=GenericityInterfaceImp.newInstance(); System.out.println("反射接口中泛型参数: K是 "+imp.getkClass().getName()+" T 是:"+imp.gettClass().getName()); } }
6. 运行结果如下:
反射接口中泛型参数: K是 java.lang.String T 是:com.xingen.classdemo.genericity.Bean
本案例的项目代码: https://github.com/13767004362/JavaDemo/tree/master/ClassDemo
相关文章推荐
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- 黑马程序员--Java基础加强--17.利用反射操作泛型VI【泛型类型变量的语义】【GenericDeclaration接口】【泛型接口TypeVariable】【通过Class反射解析泛型类】
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- Java进阶之reflection(反射机制)——通过反射操作泛型,注解
- Java学习提要——方法"反射"基本操作与"绕过泛型"实验
- Java 反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本操作,集合泛型的本质
- 学习笔记——JAVA反射<2>反射机制的效率问题和操作泛型
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程.]
- 3.java的hello word.继承.泛型.反射.配置项.数据库操作.lombok
- 反射机制_提高反射效率_操作泛型_操作注解JAVA213
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- 黑马程序员--Java基础加强--13.利用反射操作泛型II【TypeVariable】【GenericArrayType】【WildcardType】【Type及其子接口的来历】【个人总结】
- Java300StudyNote(2)反射-常用泛型操作(参数泛型、返回值泛型)
- 避免代码冗余,使用接口和泛型重构Java代码