java反射之getGenericSuperclass方法的用处
2016-06-29 10:57
579 查看
这块代码是mock平台中的一部分,由于mock的报文部分是通过freemarker模板返回的,而且模板名字的前缀和后缀都通过注解写在类里面了,下面中部分内容就是获取数据模板文件的前缀和后缀的;
从类名可以看到主要是起初始化的作用,通过反射机制获取对应类的类名,之后再通过注解获取类里面注解的具体内容来得到数据模板的前缀合后缀,刚看到这个不太明白,不过通过下面的代码大致能看到这个类起的作用;
执行结果:
class com.neteae.web.test.Person
com.neteae.web.test.Person<com.neteae.web.test.Student>
com.neteae.web.test.Student
class com.neteae.web.test.Student
在利用spring MVC框架进行web开发的过程中,注解用的特别多,而这里面反射机制起到了很大的作用,后续会继续对这两块内容进行分析;
@SuppressWarnings({ "unchecked", "deprecation" }) private void init() { Class<T> entityClass = null; Class<?> c = getClass(); Type type = c.getGenericSuperclass(); if (type instanceof ParameterizedType) { Type[] parameterizedType = ((ParameterizedType) type) .getActualTypeArguments(); entityClass = (Class<T>) parameterizedType[0]; } // 进行扫注解,确定模板的输入输出文件名 DataTemplate dataTemplate = entityClass .getAnnotation(DataTemplate.class); if (null != dataTemplate) { this.outputName = dataTemplate.output(); if (NullOrEmpty.isNullOrEmpty(dataTemplate.template())) { this.templateName = entityClass.getName(); } else { this.templateName = dataTemplate.template(); } } else { this.outputName = entityClass.getName(); this.templateName = entityClass.getName(); } this.freeMarkerCfg = new Configuration(); freeMarkerCfg.setObjectWrapper(new DefaultObjectWrapper()); freeMarkerCfg.setDefaultEncoding(Charset.forName("UTF-8").name()); }
从类名可以看到主要是起初始化的作用,通过反射机制获取对应类的类名,之后再通过注解获取类里面注解的具体内容来得到数据模板的前缀合后缀,刚看到这个不太明白,不过通过下面的代码大致能看到这个类起的作用;
package com.neteae.web.test; public class Person<T> { }
package com.neteae.web.test; import java.lang.reflect.*; public class Student extends Person<Student>{ @SuppressWarnings("unchecked") public static <T> void main(String[] args) { Student st=new Student(); @SuppressWarnings("rawtypes") Class clazz=st.getClass(); //getSuperclass()获得该类的父类 System.out.println(clazz.getSuperclass()); //getGenericSuperclass()获得带有泛型的父类 //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。 Type type=clazz.getGenericSuperclass(); System.out.println(type); //ParameterizedType参数化类型,即泛型 ParameterizedType p=(ParameterizedType)type; //getActualTypeArguments获取参数化类型的数组,泛型可能有多个 Class<T> c=(Class<T>) p.getActualTypeArguments()[0]; System.out.println(c.getName()); System.out.println(c); } }
执行结果:
class com.neteae.web.test.Person
com.neteae.web.test.Person<com.neteae.web.test.Student>
com.neteae.web.test.Student
class com.neteae.web.test.Student
在利用spring MVC框架进行web开发的过程中,注解用的特别多,而这里面反射机制起到了很大的作用,后续会继续对这两块内容进行分析;
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树