Class类和Class对象

是什么?

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中的Class类

尚硅谷-宋红康老师《Java从入门到精通》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值