是什么?
Class类也是一种类,一种特殊的类。
干什么的?
Class类可以记录各种普通类、接口信息的信息。所以想要剖析一个类,就需要用到Class类,得先获取该类的Class对象。
Class对象什么时候存在?
Class对象只能由系统创建。一个类只有被虚拟机加载之后才能使用,而类被虚拟机加载之后就会生成它对应的Class对象,用来存储该类的各种信息。
Class实例和Class对象
同一个意思,不同的表达。一个加载的类在 JVM 中只会有一个 Class 实例。
Class类和Class对象
Class对象是Class类的实例对象。一个 Class 对象对应的是一个加载到 JVM 中的一个.class 文件。
Class类与Object类
Object类是Class类的父类。 java中的类都默认继承了Object类。Object类里面有个方法叫getClass,所以任何类都能通过该方法来获取该类对应的Class对象。因此,我们能够通过实例对象反射获取类名。
Class实例和类的实例
每个类的实例都会记得自己是由哪个Class实例生成的。
有哪些Class对象?
简而言之,所有Java类型。
(1)class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部 类
(2)interface:接口
(3)[]:数组
(4)enum:枚举
(5)annotation: 注解@interface
(6)primitive type:基本数据类型 (boolean, byte, char, short, int, long, float, double)
(7)void
获取Class对象的方式(4种):
方式1:类名.class
前提:编译期间已知具体的类型。通过类的 class 属性获取,该方法最为安全可靠,程序 性能最高。
eg:
Class clazz = String.class;
方式 2:对象.getClass()
前提:已知某个类的实例,调用该实例的 getClass()方法获取 Class 对象。
eg:
Class clazz = "www.example.com".getClass();
方式 3:Class.forName(“全类名”)
前提:已知一个类的全类名,且该类在类路径下,可通过 Class 类的静态方法 forName()获取,可能抛出 ClassNotFoundException。
eg:
Class clazz = Class.forName("java.lang.String");
方式 4:对象.getClass().getClassLoader().loadClass("类的全类名")
前提:可以用系统类加载对象或自定义加载器对象加载指定路径下的类型。
eg:
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass("类的全类名");
class的常用方法
方法 | 功能说明 |
static Class forName(String name) | 返回指定类名 name 的 Class 对象 |
Object newInstance() | 调用缺省构造函数,返回该 Class 对象的一个实例 |
getName() | 返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称 |
Class[] getInterfaces() | 获取当前 Class 对象的接口 |
ClassLoader getClassLoader() | 返回该类的类加载器 |
Class getSuperclass() | 返回表示此 Class 所表示的实体的超类的Class |
Constructor[] getConstructors() | 返回一个包含某些 Constructor 对象的数组 |
Field[] getDeclaredFields() | 返回 Field 对象的一个数组 |
Method getMethod(String name, Class ...paramTypes) | 返回一个 Method 对象,此对象的形参类型为 paramType |
native boolean isInterface() | 判断该Class是否是一个接口 |
native boolean isArray() | 判断该Class是否是一个数组 (数组在Java中也是类) |
native boolean isPrimitive() | 判断该Class是否是基本类型 |
boolean isEnum | 判断是否是枚举类 |
boolean isAnnotation() | 判断该Class是否是一个注解,如果该方法返回true,isInterface方法也将返回true,因为注解是特殊的接口 |
boolean isAnnotationPresent(Class annotationClass) | 判断该类是否有注解annotationClass |
boolean isSynthetic() | 当且仅当该Class是Java语言规范定义的合成类时为true |
参考:
尚硅谷-宋红康老师《Java从入门到精通》