包目录:java.lang.reflect
接口名称:Interface Type
说明:Type是Java编程语言中所有类型的通用超级接口。 这些包括原始类型,参数化类型,数组类型,类型变量和基本数据类型。
所有已知的子接口:GenericArrayType, ParameterizedType, TypeVariable
所有已知的实现类:Class
JDK源码:
package java.lang.reflect;
/**
* Type是Java中所有类型的常用超级接口编程语言 这些包括原始类型,参数化类型,数组类型,类型变量和基本数据类型类型。
*
* @since 1.5
*/
public interface Type {
/**
* Returns a string describing this type, including information
* about any type parameters.
*
* @implSpec The default implementation calls {@code toString}.
*
* @return a string describing this type
* @since 1.8
*/
default String getTypeName() {
return toString();
}
}
ParameterizedType,GenericArrayType,TypeVariable和WildcardType四种类型的接口介绍:
(1)ParameterizedType:表示一种参数化的类型,比如Collection。获取参数化类型<>的实际类型,无论<>中有几层<>嵌套,这个方法仅仅脱去最外层的<>之后剩下的内容就作为这个方法的返回值。
(2)GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
(3)TypeVariable:是各种类型变量的公共父接口
(4)WildcardType:代表一种通配符类型表达式,比如?, ? extends Number, ? super Integer【wildcard是一个单词:就是“通配符”】
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@SuppressWarnings("unchecked")
class Father {
Class clazz;
Type[] types;
public Father() {
System.out.println(this);// Test@15db9742
// 参数化类型
types = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();
System.out.println(this.getClass().getGenericInterfaces());
System.out.println(this.getClass().getInterfaces());
clazz = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(this.getClass().getSuperclass());
Type type = this.getClass().getGenericSuperclass();
System.out.println(((ParameterizedType) type).getActualTypeArguments()[0]);
System.out.println(String.format("type1 %s ", type));
}
}
public class Test extends Father {
public static void main(String[] args) {
// Father test = new Test();
Test test = new Test();
System.out.println(test); // Test@15db9742
Type type = Test.class.getGenericSuperclass();
System.out.println(type.getClass().isAssignableFrom(ParameterizedType.class));
System.out.println(((ParameterizedType) type).getActualTypeArguments()[0]);
System.out.println(String.format("type2 %s ", type));
System.out.println(int.class.getTypeName() == Integer.TYPE.getTypeName());
}
}
Class类定义如下:
public final class Class
Class类基本用法介绍:
getClassLoader() 获取该类的类装载器。
getComponentType() 如果当前类表示一个数组,则返回表示该数组组件的 Class 对象,否则返回 null。
getConstructor(Class[]) 返回当前 Class 对象表示的类的指定的公有构造子对象。
getConstructors() 返回当前 Class 对象表示的类的所有公有构造子对象数组。
getDeclaredConstructor(Class[]) 返回当前 Class 对象表示的类的指定已说明的一个构造子对象。
getDeclaredConstructors() 返回当前 Class 对象表示的类的所有已说明的构造子对象数组。
getDeclaredField(String) 返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。
getDeclaredFields() 返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。
getDeclaredMethod(String, Class[]) 返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。
getDeclaredMethods() 返回 Class 对象表示的类或接口的所有已说明的方法数组。
【带Declared是包括公共、保护、默认(包)访问和私有的,但不包括继承的;不带Declared是包括所有公共的,包括继承;】
getField(String) 返回当前 Class 对象表示的类或接口的指定的公有成员域对象。
getFields() 返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。
getInterfaces() 返回当前对象表示的类或接口实现的接口。
getMethod(String, Class[]) 返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。
getMethods() 返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
getModifiers() 返回该类或接口的 Java 语言修改器代码。
getName() 返回 Class 对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
getCanonicalName()返回 Class 对象表示的类型的完整路径名称字符串。(比getName方法更加友好)
getResource(String) 按指定名查找资源。
getResourceAsStream(String) 用给定名查找资源。
getSigners() 获取类标记。
getSuperclass() 如果此对象表示除 Object 外的任一类, 那么返回此对象的父类对象(由于编译擦除,没有泛型)。
getGenericSuperclass()获得带有泛型的父类 (要想获得泛型,必须转换成ParameterizedType)。
isArray() 如果 Class 对象表示一个数组则返回 true, 否则返回 false。
isAssignableFrom(Class) 判定 Class 对象表示的类或接口是否同参数指定的 Class 表示的类或接口相同,或是其父类。
isInstance(Object) 此方法是 Java 语言 instanceof 操作的动态等价方法。
isInterface() 判定指定的 Class 对象是否表示一个接口类型。
isPrimitive() 判定指定的 Class 对象是否表示一个 Java 的基类型。
newInstance() 创建类的新实例。
toString() 将对象转换为字符串。
public class GenericsUtils {
private GenericsUtils() {
}
public static Class getSuperClassGenricType(Class clazz) {
return getInheritChainGenricType(clazz);
}
/**
* 获取继承链中泛型(父类没有,索引父类的父类,顶多线上索引4层)
*
* @param clazz
* @return
*/
private static Class getInheritChainGenricType(Class clazz) {
Class super1Clazz = getSuperClassGenricType(clazz, 0);
if (super1Clazz == null) {
Class super1 = clazz.getSuperclass();
Class super2Clazz = getSuperClassGenricType(super1, 0);
if (super2Clazz == null) {
Class super2 = super1.getSuperclass();
Class super3Clazz = getSuperClassGenricType(super2, 0);
if (super3Clazz == null) {
Class super3 = super2.getSuperclass();
Class super4Clazz = getSuperClassGenricType(super3, 0);
if (super4Clazz == null) {
return null;
} else {
return super4Clazz;
}
} else {
return super3Clazz;
}
} else {
return super2Clazz;
}
}
return super1Clazz;
}
/**
* 超早某个类的父类的泛型
*
* @param clazz
* @param index
* @return
*/
private static Class getSuperClassGenricType(Class clazz, int index) {
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType))
return null;
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0)
return Object.class;
if (!(params[index] instanceof Class))
return Object.class;
return (Class) params[index];
}
}