java反射之getGenericSuperclass方法的用处

            这块代码是mock平台中的一部分,由于mock的报文部分是通过freemarker模板返回的,而且模板名字的前缀和后缀都通过注解写在类里面了,下面中部分内容就是获取数据模板文件的前缀和后缀的;

@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开发的过程中,注解用的特别多,而这里面反射机制起到了很大的作用,后续会继续对这两块内容进行分析;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章