jianglilili / jianglilili/guodegang.github.io

Class类与Java反射

Open
#10 0 comments 0 reactions 0 assignees View on GitHub
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()方法来获得

通过反射可访问的描述信息
![image](https://user-images.githubusercontent.com/46592435/52163063-bff8de80-2717-11e9-8e9d-7a53240aaa66.png)
**在通过getFields()和getMethods()方法依次获得权限为public的成员变量和方法时,还包括从超类中继承到的成员变量和方法;**
**而通过getDeclaredFields()和getDeclaredMethods()方法只是获得在本类中定义的所有成员变量和方法**

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.