概述
Class类的实例代表一个运行的Java应用中的类和接口。 enum是一种类 annotation是一种接口 每个数组都是一个类,该类被反射为一个Class对象。被所有相同元素和维数的数组共享。基本的Java数据类型boolean, byte, char, chort, int, long, float, double, void 都代表了Class类的对象。Class类没有公共的构造器。 Class的对象由java虚拟机自动构建,通过调用defineclass()方法加载。
继承关系
public final class Class implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement
实现了 java.io.Serializable, GenericDeclaration, Type, AnnotatedElement 4个接口。
成员属性
- private transient String name;
- private final ClassLoader classLoader;
构造器
Class类没有公共的构造方法,Class对象是在类加载的时候由Java虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。一个类被加载到内存并供我们使用需要经历如下三个阶段:
加载,这是由类加载器(ClassLoader)执行的。通过一个类的全限定名来获取其定义的二进制字节流(Class字节码),将这个字节流所代表的静态存储结构转化为方法去的运行时数据接口,根据字节码在java堆中生成一个代表这个类的java.lang.Class对象。
链接。在链接阶段将验证Class文件中的字节流包含的信息是否符合当前虚拟机的要求,为静态域分配存储空间并设置类变量的初始值(默认的零值),并且如果必需的话,将常量池中的符号引用转化为直接引用。
初始化。到了此阶段,才真正开始执行类中定义的java程序代码。用于执行该类的静态初始器和静态初始块,如果该类有父类的话,则优先对其父类进行初始化。
private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}
关键方法
toString()
返回Class实体的名称。例如 "abc".getClass().toString()
class java.lang.String
public String toString()
toGenericString()
返回宇哥字符串的描述信息。包括修饰符和类型信息。 例如: "abc".getClass().toGenericString():
public final class java.lang.String
public String toGenericString()
forName()
用指定的类加载器,根据指定的名称,返回和该类或者接口 相关的Class对象。
public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException
根据给定的名称,返回和该类或者接口 相关的Class对象。
@CallerSensitive
public static Class<?> forName(String className) throws ClassNotFoundException
newInstance()
用Class 对象 创建一个类的实例。以空的参数列表实例化类。 如果没有被初始化,该类就会被初始化。
@CallerSensitive
public T newInstance() throws InstantiationException, IllegalAccessException
isInstance()
判断指定的对象是不是一个类的实例。等效于java语言的instanceof操作符。 如果指定的Object参数不为空,并且可以强制转换为由该 Class 对象表示的引用类型, 而不引发 ClassCastException,则该方法返回 true,否则返回 false。
public native boolean isInstance(Object obj);
isAssignableFrom()
判断当前类是不是参数类的父类。或者父接口。
public native boolean isAssignableFrom(Class<?> cls);
isInterface()
public native boolean isInterface();
isArray()
public native boolean isArray();
isPrimitive()
public native boolean isPrimitive();
isAnnotation()
public boolean isAnnotation() {
return (getModifiers() & ANNOTATION) != 0;
}
isSynthetic()
public boolean isSynthetic() {
return (getModifiers() & SYNTHETIC) != 0;
}
getName()
public String getName() {
String name = this.name;
if (name == null)
this.name = name = getName0();
return name;
}
getClassLoader()
返回类的加载器。有一些实现里,用null代表boostrap类加载器。
@CallerSensitive
public ClassLoader getClassLoader()
getTypeParameters()
返回一个由 TypeVariable对象组成的数组。该数组按照声明顺序表示该GenericDeclaration对象表示的范型声明声明的变量。
@SuppressWarnings("unchecked")
public TypeVariable<Class<T>>[] getTypeParameters()
代码实力:
HashMap<String, Object> map = new HashMap<>();
TypeVariable[] t = map.getClass().getTypeParameters();
System.out.println(t.length);
System.out.println(t[0].getName());
System.out.println(t[1].getName());
>> 2
>> K
>> V
getSuperclass()
返回父类
public native Class<? super T> getSuperclass();
getGenericSuperclass()
如果父类是参数化的类型。那么返回的Type对象必须真是的反映了源代码中的实际的类型参数。参数化的类型表示,如果父类没有被创建,则创建它。返回直接父类,包含范型参数
public Type getGenericSuperclass()
getPackage()
获取包名
public Package getPackage()
getInterfaces()
确定由"该对象表示的类或者接口" 实现的接口。 如果该对象是一个类。那么返回值是所有该类实现的接口。
public Class<?>[] getInterfaces()
getGenericInterfaces()
确定由"该对象表示的类或者接口" 实现的接口。如果一个父接口是一个参数化的类型。那么返回的Type对象必须反应了源代码中真是的类型参数。参数化的类型代表了每个父接口如果没有被创建的化,就会被创建。 如果该对象是一个类,那么返回值是一个数组。数组包含了该类实现的所有接口。 如果该对象是一个接口,数组包含了该接口直接继承的接口。 如果该对象表示一个基本类型或者void。那么返回的是一个长度为0的数组。
public Type[] getGenericInterfaces()
getComponentType()
返回 代表了一个数组的组件类型的类。 如果类不表示任何数组类。那么方法会返回null
public native Class<?> getComponentType();
getModifiers()
返回修饰符。编码为一个integer。
public native int getModifiers();
getSigners()
返回类的签署人。
public native Object[] getSigners()
setSigners()
设置人的签署人。
native void setSigners(Object[] signers);
getEnclosingMethod()
如果该类代表了在一个方法内的本地或者匿名类。 返回一个Method对象。 这个Method对象表示底层类的直接封闭方法。否则返回false。 特别的,如果基础类是有类型声明、实例初始化或者静态初始化直接封装的本地匿名类,此方法返回false。
@CallerSensitive public Method getEnclosingMethod() throws SecurityException
getEnclosingConstructor()
如果该类的对象表示 在一个构造器内的 本地或者匿名类。返回一个Constructor对象。该对象表示底层类的直接封装构造器。
@CallerSensitive public Constructor<?> getEnclosingConstructor() throws SecurityException
getDeclaringClass()
如果该对象表示的类或者接口,是一个其他类的成员变量。返回该对象所处的对象。 如果该对象或者接口不是任何其他类的成员变量。那么返回false。 如果该对象表示一个数组类,基础类型或者void,那么会返回null
@CallerSensitive public Class<?> getDeclaringClass() throws SecurityException
getEnclosingClass()
返回底层类的直接封装类。如果底层类是一个顶级的类,返回null。
@CallerSensitive public Class<?> getEnclosingClass() throws SecurityException
getSimpleName()
返回底层类的简单名称。这个名称在源代码里有提供。 如果底层类是匿名的,返回false。
public String getSimpleName()
getTypeName()
以字符串形式,返回该类型对应的信息。
public String getTypeName()
getCanonicalName()
返回底层类的规范名称,该名称定义在 Java Language Specification。如果底层类没有任何规范的名称,返回null
public String getCanonicalName()
isAnonymousClass()
判断是否匿名类。
public boolean isAnonymousClass()
isLocalClass()
判断是否局部类
public boolean isLocalClass() {
return isLocalOrAnonymousClass() && !isAnonymousClass();
}
isMemberClass()
判断是否成员类
public boolean isMemberClass() {
return getSimpleBinaryName() != null && !isLocalOrAnonymousClass();
}
getClasses()
返回一个数组,其中包含{@code Class}对象,这些对象表示此{@code Class}对象表示的类的所有公共类和接口。这包括从超类继承的公共类和接口成员,以及由该类声明的公共类和接口成员。如果此{@code Class}对象没有公共成员类或接口,则此方法返回长度为0的数组。如果此{@code Class}对象表示原始类型,数组类或void,则此方法还返回长度为0的数组。
@CallerSensitive public Class<?>[] getClasses()
getFields()
返回一个数组,包含了该Class对象表示的类或者接口 所有可访问的public字段。
@CallerSensitive public Field[] getFields() throws SecurityException
getMethods()
返回一个数组,包含了该Class对象表示的类或者接口 所有可访问的公共方法。包括继承的。
@CallerSensitive public Method[] getMethods() throws SecurityException
getConstructors()
返回该对象表示的接口或者类 的所有构造器。如果没有公共的构造器,或者这个类是一个数组类,或者类对应了一个基础类型或者void,那么返回长度为0的数组。
@CallerSensitive public Constructor<?>[] getConstructors() throws SecurityException
getDeclaredClasses()
返回一组 Class 对象的数组,这些对象反映了声明为此 Class 对象表示的类的成员的所有类和接口。这包括公共,受保护的,默认(程序包)访问以及由该类声明的私有类和接口,但不包括继承的类和接口。如果类未声明任何类或接口作为成员,或者此 Class 对象表示原始类型,数组类或void,则此方法返回长度为0的数组。
@CallerSensitive public Class<?>[] getDeclaredClasses() throws SecurityException
getDeclaredFields()
返回一组 Field 对象的数组,这些对象反映了此 Class 对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(程序包)访问和私有字段,但不包括继承的字段。如果此 Class 对象表示没有声明字段的类或接口,则此方法返回长度为0的数组。如果此 Class对象表示数组类型,原始类型或void,则此类型方法返回长度为0的数组。返回的数组中的元素未排序,并且没有任何特定顺序。
@CallerSensitive public Field[] getDeclaredFields() throws SecurityException
getDeclaredMethods()
返回一个包含Method对象的数组,这些对象反映此Class对象表示的类或接口的所有已声明方法, 包括公共,受保护,默认(程序包)访问和私有方法,但不包括继承的方法。 如果此Class对象表示具有多个声明的方法的类型,这些方法具有相同的名称和参数类型,但返回类型不同, 则对于每个此类方法,返回的数组都有一个Method对象。 如果此Class对象表示具有类初始化方法{@code}的类型,则返回的数组没有相应的Method对象。 如果此Class对象表示没有声明方法的类或接口,则返回的数组长度为0。 如果此Class对象表示数组类型,原始类型或void,则返回数组长度为0。 返回数组中的元素未排序,并且没有任何特定顺序。
@CallerSensitive public Method[] getDeclaredMethods() throws SecurityException
getDeclaredConstructors()
返回一组 Constructor 对象的数组,这些数组反映此Class对象表示的类声明的所有构造函数。 包括publi, protected, default和 private 构造函数。返回的数组中的元素未排序,并且没有任何特定顺序。 如果该类具有默认构造函数,则它将包含在返回的数组中。如果此Class对象表示接口,原始类型,数组类或void,则此方法返回长度为0的数组。
@CallerSensitive public Constructor<?>[] getDeclaredConstructors() throws SecurityException
getResourceAsStream()
public InputStream getResourceAsStream(String name)
isEnum()
当且仅当该类在代码中被声明为一个枚举类型,返回true
public boolean isEnum() {
// An enum must both directly extend java.lang.Enum and have
// the ENUM bit set; classes for specialized enum constants
// don't do the former.
return (this.getModifiers() & ENUM) != 0 &&
this.getSuperclass() == java.lang.Enum.class;
}
getEnumConstants()
如果该类是一个枚举类,返回枚举类的元素数组。 如果不是枚举类,返回false
public T[] getEnumConstants()
cast()
将对象强制转换为此类对象表示的类或接口。
@SuppressWarnings("unchecked")
public T cast(Object obj)
asSubclass()
强制转化为子类,如果不能转成功,会抛出ClassCastException异常。
@SuppressWarnings("unchecked")
public <U> Class<? extends U> asSubclass(Class<U> clazz)
getAnnotation()
获取注解
@SuppressWarnings("unchecked")
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
isAnnotationPresent()
如果指定类型的注释存在于此元素上, 否则返回false。这种方法的设计主要是为了方便访问标记注释.
@Override
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
getAnnotationsByType()
根据类型获取注解
@Override
public <A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass)
getAnnotations()
获取所有注解
public Annotation[] getAnnotations()
getDeclaredAnnotation()
返回直接存在于此对象的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。
@Override
@SuppressWarnings("unchecked")
public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass)
getDeclaredAnnotationsByType()
根据类型获取所有直接存在于此对象上的所有注解。
@Override
public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationClass)
getDeclaredAnnotations()
获取所有直接作用在此对象上的注解
public Annotation[] getDeclaredAnnotations()
getAnnotatedSuperclas()
返回父类的注解的AnnotatedType
public AnnotatedType getAnnotatedSuperclass()
getAnnotatedInterfaces()
得到该类的所有注解的类类型数组。
public AnnotatedType[] getAnnotatedInterfaces()
常见问题
Java中的五种类
top level class
nested class (静态内部类)
inner class(非静态内部类)
local class(在方法内定义的类)
anonymous class(匿名类)
希望和大家多多交流
我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。