类加载器及反射简单笔记

目录

一、类加载器

二、反射


一、类加载器

类加载器负责将.class文件(存储的物理文件)加载到内存中

类加载的时机:

1. 创建类的实例

2. 调用类的类方法

3. 访问类或接口的类变量,或者为该类变量赋值

4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

5. 初始化某个类的子类

6. 直接使用java.exe命令来运行某个主类

类加载的过程:

其中验证、准备、解析这三步属于连接的过程

加载

1. 通过类的全限定名来获取定义此类的二进制字节流

2. 将这个字节流所代表的静态存储结构转化为运行时数据结构(加载到内存中)

3. 在内存中生成一个代表这个类的java.lang.Class对象(任何类被使用时,系统都会为它建立一个java.lang.Class对象)

 连接

1. 验证:确保Class文件字节流中包含的信息符合虚拟机要求,不会危害虚拟机自身安全

2. 准备:为类的类变量分配内存,并设置默认初始化值

3. 解析:将二进制数据流中的符号引用替换为直接引用,意思是找到需要用到的类

初始化:

根据程序员通过程序制定的主观计划去初始化类变量和其他资源(静态变量赋值和初始化其他资源)

类加载器的分类:

启动类加载器(Bootstrap ClassLoader):虚拟机内置的类加载器

平台类加载器(Platform ClassLoader):负责加载JDK中一些特殊的模块

系统类加载器(System ClassLoader):负责加载用户类路径上所指定的类库

双亲委派模型:

● 类加载器收到加载任务时会将加载任务逐层向上传递给父类加载器,最终到达顶层的启动类加载器
● 当启动类加载器不能完成加载任务时,再委托给下层的子类加载器,最终完成类的加载
● ClassLoader对象的getParent()方法可以获取父类加载器

常用方法:

方法名说明
public static ClassLoader getSystemClassLoader()获取系统类加载器
public InputStream getResourceAsStream(String name)加载某一个资源文件

二、反射

概述:

1. 在运行状态中,对于任何一个类都能知道这个类的所有属性和方法
2. 对于任何一个对象,都能够调用它的任意方法和属性
3. 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制

获取Class对象:

1. 通过 Class.forName(全类名) 获取,该方法是Class类的静态方法
2. 通过 类名.class 获取
3. 通过 对象.getClass() 获取
4. 注意:这三种方式获取的Class对象是同一个Class对象,一个类在JVM中只会有一个Class对象

反射获取构造方法:

方法名说明
Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组(包括私有)
Constructor<?> getConstructor(Class<?>...parameterTypes)获取单个、公共的构造方法对象,如果是无参构造则该方法参数留空,如果是有参则该方法参数是参数类型的Class对象
Constructor<?> getDeclaredConstructor(Class<?>...parameterTypes)获取单个、公共或私有的构造方法对象,如果是无参构造则该方法参数留空,如果是有参则该方法参数是参数类型的Class对象

由获取的构造方法对象创建对象

1. 可以利用构造方法类Constructor中的 T newInstance(Object...initargs) 方法来创建对象

2. 如果该构造方法是私有的构造方法,则创建对象之前需要使用Constructor类中的 void setAccessible(boolean b) 方法临时取消访问检查

反射获取成员变量:

方法名说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)根据变量名获取一个公共成员变量对象
Field getDeclaredField(String name)根据变量名获取一个成员变量对象

由Field对象操作成员变量

1. void set(Object o,Object v) ,设置某个成员变量的值,第一个参数是需要设置成员变
量的对象,第二个参数是成员变量的值

2. Object get(Object o) ,获取某个对象的当前成员变量的值
3. 注意,如果成员变量是私有的,在使用get和set方法时也需要使用setAccessible()方法暂时取消访问检查

反射获取成员方法:

方法名说明
Method[] getMethods()获取所有公共成员方法对象数组
Method[] getDeclaredMethods()获取所有成员方法对象数组
Method getMethod(String name,Class<?>...parameterTypes)获取一个公共的成员方法对象,第一个参数是方法名,第二个参数是方法的参数的Class对象
Method getDeclaredMethod(String name,Class<?>...parameterTypes)获取一个成员方法对象,第一个参数是方法名,第二个参数是方法的参数的Class对象

由Method对象操作成员方法:

● 使用 Object invoke(Object o,Object...args) 方法可以运行成员方法
● 第一个参数是指调用该方法的对象
● 第二个参数是指该方法的参数
● 返回值Object是成员方法的返回值,如果没有则可以不用接收

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏志121

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值