JAVA 反射之java.lang.Class API 详解

JAVA 反射之java.lang.Class API 详解

Scroll Down

概述

Class是一个位于java.lang包下面的一个类,在java中每个类实例都有对应的class对象。类对象是由java虚拟机(JVM)自动构造

Class类的方法经常在反射时被调用

反射族谱_1604028606247

创建Class对象

创建Class对象的三种方式

  1. Class.forName("className"): 因为Class类没有公共的构造方法,所以存在一个静态的方法返回Class对象,即Class.forName()用于创建Class对象。要创建的Class对象的类名在运行时确定,不存在则抛出ClassNotFoundException。(注意className为类的完整包名)
    	Class.forName("java.lang.String")
    
  2. MyClass.class:当我们在类名后面跟上.class时,就会返回当前类的Class对象。它主要应用于原始数据类型,并且仅在我们知道类的名称时才使用。要创建的Class对象的类名在编译时确定
    	Class c2 = String.class;
    

    请注意,此方法与类名一起使用,而不是与类实例一起使用

    	A a = new A();   // Class A 的实例a
    	Class c = A.class; // 正确用法
    	Class c = a.class; //编译出错
    
  3. obj.getClass(): 此方法存在时Object类中,它返回此obj对象的运行时类。
    	String str = new String("string");
    	Class c3 = str.getClass();
    

Class 方法

修饰符和类型方法和描述
<U> Class<? extends U> asSubclass(Class<U> clazz)转换此Class对象以表示由指定的类对象表示的类的子类
T cast(Object obj)将对象强制转换为此Class对象所表示的类或接口。
boolean desiredAssertionStatus()如果要在调用此方法时初始化,则返回将分配给此类的断言状态。
static Class<?> forName(String className)返回与具有给定字符串名称的类或接口关联的Class对象。
static Class<?> forName(String name,boolean initialize,ClassLoader loader)使用给定的类加载器返回与具有给定字符串名称的类或接口关联的Class对象。
AnnotatedType[] getAnnotatedInterfaces()返回AnnotatedType对象的数组,这些对象表示使用类型来指定此Class对象所表示的实体的超接口。
AnnotatedType getAnnotatedSuperclass()返回AnnotatedType对象,该对象表示使用类型来指定此Class对象所表示的实体的超类。
<A extends Annotation> A getAnnotation(Class<A> annotationClass)如果存在这样的注释,则返回指定类型的此元素的注释,否则返回null。
Annotation[] getAnnotations()返回此元素上存在的注释。
<A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass) 返回与此元素关联的注释。
String getCanonicalName() 返回Java语言规范定义的基础类的规范名称。
Class<?>[] getClasses()返回一个数组,其中包含Class对象,这些对象表示作为此Class对象所表示的类的成员的所有公共类和接口。
ClassLoader getClassLoader()返回类的类加载器。
Class<?> getComponentType()返回表示数组的组件类型的Class。
Constructor<T> getConstructor(Class<?>... parameterTypes)返回一个Constructor对象,该对象反映此Class对象所表示的类的指定公共构造函数。
Constructor<?>[] getConstructors()返回一个包含Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造函数。
<A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass)如果直接存在这样的注释,则返回指定类型的此元素的注释,否则返回null。
Annotation[] getDeclaredAnnotations()返回直接出现在此元素上的注释。
<A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationClass)如果此类注释直接存在或间接存在,则返回指定类型的此元素的注释。
Class<?>[] getDeclaredClasses()返回Class对象的数组,这些对象反映声明为此Class对象所表示的类的成员的所有类和接口。
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)返回一个Constructor对象,该对象反映此Class对象所表示的类或接口的指定构造函数。
Constructor<?>[] getDeclaredConstructors()返回Constructor对象的数组,这些对象反映由此Class对象表示的类声明的所有构造函数。
Field getDeclaredField(String name)返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定声明字段
Field[] getDeclaredFields()返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定声明方法。
Method[] getDeclaredMethods()返回一个数组,其中包含反映此Class对象所表示的类或接口的所有声明方法的Method对象,包括public,protected,default(包)访问和私有方法,但不包括继承的方法。
Class<?> getDeclaringClass()如果此Class对象表示的类或接口是另一个类的成员,则返回表示声明它的类的Class对象。
Class<?> getEnclosingClass()返回基础类的直接封闭类。
Constructor<?> getEnclosingConstructor()如果此Class对象表示构造函数中的本地或匿名类,则返回一个Constructor对象,该对象表示基础类的直接封闭构造函数。
Method getEnclosingMethod()如果此Class对象表示方法中的本地或匿名类,则返回表示基础类的直接封闭方法的Method对象。
T[] getEnumConstants()返回此枚举类的元素,如果此Class对象不表示枚举类型,则返回null。
Field getField(String name)返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定公共成员字段。
Field[] getFields()返回一个包含Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段。
Type[] getGenericInterfaces()返回表示由此对象表示的类或接口直接实现的接口的Types。
Type getGenericSuperclass()返回表示此Class表示的实体(类,接口,基本类型或void)的直接超类的Type。
Class<?>[] getInterfaces()确定由此对象表示的类或接口实现的接口。
Method getMethod(String name, Class<?>... parameterTypes)返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()返回一个包含Method对象的数组,这些对象反映此Class对象所表示的类或接口的所有公共方法,包括由类或接口声明的那些以及从超类和超接口继承的那些。
int getModifiers()返回此类或接口的Java语言修饰符,以整数编码。
String getName()以String形式返回此Class对象表示的实体名称(类,接口,数组类,基本类型或void)。
Package getPackage()获取此类的包。
ProtectionDomain getProtectionDomain()返回此类的ProtectionDomain。
URL getResource(String name)查找具有给定名称的资源。
InputStream getResourceAsStream(String name)查找具有给定名称的资源。
Object[] getSigners()获取此类的签名者。
String getSimpleName()返回源代码中给出的基础类的简单名称。
Class<? super T> getSuperclass()返回表示此Class表示的实体(类,接口,基本类型或void)的超类的Class。
String getTypeName()返回此类型名称的信息字符串。
TypeVariable<Class<T>>[] getTypeParameters()返回TypeVariable对象的数组,这些对象表示由此GenericDeclaration对象以声明顺序表示的泛型声明声明的类型变量。
boolean isAnnotation()如果此Class对象表示注释类型,则返回true。
boolean isAnnotationPresent(Class<?extends Annotation> annotationClass)如果此元素上存在指定类型的注释,则返回true,否则返回false。
boolean isAnonymousClass()当且仅当基础类是匿名类时返回true。
boolean isArray()确定此Class对象是否表示数组类。
boolean isAssignableFrom(Class<?> cls)确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。
boolean isEnum()当且仅当此类在源代码中声明为枚举时返回true。
boolean isInstance(Object obj)确定指定的Object是否与此Class表示的对象分配兼容。
boolean isInterface()确定指定的Class对象是否表示接口类型。
boolean isLocalClass()当且仅当基础类是本地类时返回true。
boolean isMemberClass()当且仅当底层类是成员类时返回true。
boolean isPrimitive()确定指定的Class对象是否表示基本类型。
boolean isSynthetic()如果此类是合成类,则返回true; 否则返回false。
T newInstance()创建此Class对象表示的类的新实例。
String toGenericString()返回描述此Class的字符串,包括有关修饰符和类型参数的信息。
String toString()将对象转换为字符串。

相关类

  1. ClassLoader
  2. TypeVariable
  3. Type
  4. Package
  5. Field
  6. Method
  7. Constructor

Thanks

  1. 作者:淡淡的伤你
    链接:https://www.jianshu.com/p/9a67de61e385
    来源:简书
  2. 作者: aston
    链接: https://www.cnblogs.com/aston/p/9383013.html
    来源: 博客园