jianglilili / jianglilili/guodegang.github.io
Class类与Java反射
- Dominant language
- No language data
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
### 什么是Class类
- Class类是一个比较特殊的类。特殊在哪里呢?特殊在这是一个在类加载过程中由虚拟机生成的,由于表示被加载类的类型信息的对象。简单地说,我们创建一个int变量,那么这个int变量是个整数类型,那么我们怎么知道这个类型是整数类型呢?就是通过这个Class类来知道的。 java是面向对象编程的,java中几乎所有的数据都是对象,那么是对象,就必须知道自己到底是哪一种类型的对象。于是Class来便顺势而生了
在程序运行期间,java运行时系统始终为所有的对象维护一个被称为**运行时的类型标识**。这个信息跟踪每个对象所属的类。**JVM利用运行时信息选择相应的方法执行,而保存这些信息的类称为Class**。可能容易产生混淆,容易想到class。不过二者没什么关系,class不过是描述类的一个关键字。而**Class却是保存着运行时信息的类**
**注意:Class是java中api中的类名,class是一个关键字。Class是反射技术的核心**
**每一个class都有一个Class对象。一个java文件经过编译,再生成.class文件中,就会创建一个Class对象。只有一个,它表示整个类的类型信息**
它有什么作用?Class类可以帮助我们在程序运行时分析类,说白了就是**获取类中的值**。可能瞬间就想到了反射,没错!Class一般就是和反射配套使用的,因为我们向Class类提供一个类或一个类的类名,Class就可以提供我们很多信息,比如属性/方法/修饰符/构造器/类名等等。然后我们就可以进一步进行反射。
- **对象的表达方法**
- **1**.知道类名,则可以使用“**Class c1=类名.class**”;来表示该类所代表的实例对象
- **2**.知道类的对象,则可以使用“**Class c2=对象名.getClass()**”;来表示
- **3**.知道类的全路径,例如类的全路径:com.reflect.Foo,则可以通过**c3=Class.forName(“com.reflect.Foo”)**;来表示
- **创建对象的五种方式**
- **1**.通过new语句创建对象
- **2**.通过静态工厂方法创建,比如A.getNewInstance();
- **3**.通过反射技术来实现。可以调用Class类或Constructor类的newInstance()方法
- **4**.通过调用对象的clone()方法
- **5**.利用I/O流技术的反序列化来实现
- **获取Class对象(实例)的三种方法**
- **1**.通过class的方法创建Class实例:类名.class
- **2**.通过对象的getClass()方法获得
- **3**.通过Class类的forName()方法来获得
通过反射可访问的描述信息

**在通过getFields()和getMethods()方法依次获得权限为public的成员变量和方法时,还包括从超类中继承到的成员变量和方法;**
**而通过getDeclaredFields()和getDeclaredMethods()方法只是获得在本类中定义的所有成员变量和方法**
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.