一般而言,我们需要通过getModifiers()方法判断修饰符是否public,如果是非public,则需要调用setAccessible(true)进行修饰符抑制,否则会因为无权限访问会抛出异常。
GenericDeclaration接口GenericDeclaration接口继承自AnnotatedElement,它的源码如下:
public interface GenericDeclaration extends AnnotatedElement { public TypeVariable<?>[] getTypeParameters(); }新增了一个方法getTypeParameters()用于返回类型变量TypeVariable数组,这里的TypeVariable是类型变量,它的定义如下:
public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement { //获得泛型的类型(Type)上限数组,若未明确声明上边界则默认为Object Type[] getBounds(); //获取声明该类型变量实体(即获得类、方法或构造器名) D getGenericDeclaration(); //获得泛型参数的字面量名称,即K、V、E之类名称 String getName(); //获得泛型的注解类型(AnnotatedType)上限数组,若未明确声明上则为长度为0的空数组 AnnotatedType[] getAnnotatedBounds(); }后面的文章介绍泛型的时候再展开。
Executable类Executable是一个抽象类,它继承自AccessibleObject,实现了Member和GenericDeclaration接口。Executable的实现类是Method和Constructor,它的主要功能是从Method和Constructor抽取出两者可以共用的一些方法例如注解的操作,参数的操作等等,这里不详细展开。
ModifierModifier主要提供一系列的静态方法,用于判断基于int类型的修饰符参数的具体类型,这个修饰符参数来源于Class、Constructor、Method、Field、Parameter的getModifiers()方法。下面介绍一下Modifier的主要方法:
方法 功能static boolean isAbstract(int mod) 整数modifier参数是否包括abstract修饰符
static boolean isFinal(int mod) 整数modifier参数是否包括final修饰符
static boolean isInterface(int mod) 整数modifier参数是否包括interface修饰符
static boolean isNative(int mod) 整数modifier参数是否包括native修饰符
static boolean isPrivate(int mod) 整数modifier参数是否包括private修饰符
static boolean isProtected(int mod) 整数modifier参数是否包括protected修饰符
static boolean isPublic(int mod) 整数modifier参数是否包括public修饰符
static boolean isStatic(int mod) 整数modifier参数是否包括static修饰符
static boolean isStrict(int mod) 整数modifier参数是否包括strictfp修饰符
static boolean isSynchronized(int mod) 整数modifier参数是否包括synchronized修饰符
static boolean isTransient(int mod) 整数modifier参数是否包括transient修饰符
static boolean isVolatile(int mod) 整数modifier参数是否包括volatile修饰符
static boolean toString(int mod) 返回描述指定修饰符中的访问修饰符标志的字符串
Class类
Class实现了Serializable、GenericDeclaration、Type、AnnotatedElement接口,它提供了类型判断、类型实例化、获取方法列表、获取字段列表、获取父类泛型类型等方法。下面主要介绍一下它的主要方法:
方法 功能Class<?> forName(String className) 传入全类名创建Class实例
T newInstance() 通过当前的Class实例进行实例化对象,返回的就是新建的对象
int getModifiers() native方法,返回当前Class的修饰符
String getName() 返回类名称,虚拟机中类名表示
String getCanonicalName() 返回类名称,便于理解的类名表示
String getSimpleName() 返回类名称,源代码中给出的底层类的简单名称
Package getPackage() 返回类的包属性
String getPackageName() 返回类的包路径名称
String toGenericString() 返回描述此Class的字符串,其中包括类型参数的字面量
TypeVariable<Class<T>>[] getTypeParameters() 获取类定义泛型的类型变量
Class<?>[] getClasses() 获取所有的修饰符为public的成员Class,包括父类
Class<?>[] getDeclaredClasses() 获取本类所有修饰符的成员Class,不包括父类
Constructor<?>[] getConstructors() 获取所有的修饰符为public的构造器,包括父类
Constructor<T> getConstructor(Class<?>... parameterTypes) 获取参数类型匹配的修饰符为public的构造器,包括父类
Constructor<?>[] getDeclaredConstructors() 获取本类所有修饰符的构造器,不包括父类
Constructor<T>[] getDeclaredConstructor(Class<?>... parameterTypes) 获取本类参数类型匹配的所有修饰符的构造器,不包括父类
Method[] getMethods() 获取本类所有的修饰符为public的方法列表,包括父类
Method[] getDeclaredMethods() 获取本类所有修饰符的方法列表,不包括父类
Method getMethod(String name, Class<?>... parameterTypes) 通过指定方法名和参数类型获取本类修饰符为public的方法,包括父类
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 通过指定方法名和参数类型获取本类不限修饰符的方法,不包括父类
Field[] getFields() 获取本类所有的修饰符为public的属性列表,包括父类
Field[] getDeclaredFields() 获取本类所有修饰符的属性列表,不包括父类
Field getField(String name) 通过指定属性名名获取本类修饰符为public的属性,包括父类
Field getDeclaredField(String name) 通过指定属性名获取本类不限修饰符的属性,不包括父类
Class<?>[] getInterfaces() 获取类实现的所有接口的Class数组
Type[] getGenericInterfaces() 获取类实现的所有泛型参数接口的Type数组
Class<? super T> getSuperclass() 获取当前类的父类的Class,如果当前类是Object、接口、基本数据类型(primitive)或者void,则返回null
Type getGenericSuperclass() 获取当前类的泛型参数父类的Type,如果当前类是Object、接口、基本数据类型(primitive)或者void,则返回null
native boolean isInstance(Object obj) 判断传入的object是否当前类的实例
native boolean isAssignableFrom(Class<?> cls) 判断传入的Class对象是否和当前类相同,或者是否当前类的超类或超接口
native boolean isInterface() 判断当前类是否接口
native boolean isArray() 判断当前类是否数组
native boolean isPrimitive() 判断当前类是否基本数据类型
boolean isAnnotation() 判断当前类是否注解类型
boolean isSynthetic() 判断当前类是否复合
native Class<?> getComponentType() 如果当前类是数组,返回数组元素的类型
Class<?> getEnclosingClass() 返回一个类,当前类(一般是成员类)在这个类(封闭类,相对于内部类的外部类或者说外面一层)中定义
Constructor<?> getEnclosingConstructor() 返回构造器,当前类是在这个构造函数中定义
Method getEnclosingMethod() 返回方法,当前类是在这个方法中定义
Module getModule() 返回模块,JDK9新增方法