类加载器、反射、枚举

一、类加载器

1.作用:

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

2.类加载时机:

  • 创建类的实例
  • 调用类的类方法
  • 访问类或者接口的类变量,或者为该类变量赋值
  • 使用反射方式来强制创建某个类或接口对应的class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

3.类加载过程

加载、链接、准备、解析、初始化

4.类加载的分类

Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null
Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块
System class loader系统类加载器,负责加载用户类路径上所指定的类库

类加载器的继承关系

  • System的父加载器为Platform

  • Platform的父加载器为Bootstrap

 5.双亲委派模型

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

6.ClassLoader 中的两个方法

public static ClassLoader getSystemClassLoader()  :获取系统类加载器

public InputStream getResourceAsStream(String name):加载某一个资源文件

二、反射 

1.反射概念

 反射 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法

2.获取Class类对象的三种方式

 三种方式分类

类名.class属性

对象名.getClass()方法

Class.forName(全类名) ----->最常用

3.反射获取构造方法(Constructor类)

Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes)返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)返回单个构造方法对象
Constructor类用于创建对象的方法

 T newInstance(Object...initargs) :根据指定的构造方法创建对象

(如果是public的,直接创建对象  newInstance(Object... initargs) ) 

 setAccessible(boolean flag)  :  设置为true,表示取消访问检查 --->暴力反射setAccessible(boolean) .操作属性完成后将权限关闭。 .setAccessible(false)

(如果是非public的,需要临时取消检查,然后再创建对象 )

4.反射获取成员变量

Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象
Field类用于给成员变量赋值的方法
void set(Object obj, Object value)赋值
Object get(Object obj)获取值

5.反射获取成员方法

Method[] getMethods()返回所有公共成员方法对象的数组包括继承
Method[] getDeclaredMethods()返回所有成员方法对象的数组包括继承
Method getMethod(String name, Class<?>... parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回单个成员方法对象
 Method类用于执行方法的方法

Object invoke(Object obj, Object... args)  : 运行方法

参数一: 用obj对象调用该方法

参数二: 调用方法的传递的参数(如果没有就不写)

返回值: 方法的返回值(如果没有就不写)

三、枚举

1.概念 

为了间接的表示一些固定的值,Java就给我们提供了枚举 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内

2.格式

public enum s {   
    枚举项1,枚举项2,枚举项3;
}
注意: 定义枚举类要用关键字enum

 3.枚举的特点

  • 所有枚举类都是Enum的子类

  • 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项

  • 每一个枚举项其实就是该枚举的一个对象

  • 枚举也是一个类,也可以去定义成员变量

  • 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

  • 枚举类可以有构造器,但必须是private的,它默认的也是private的。

    枚举项的用法比较特殊:枚举("");

  • 枚举类也可以有抽象方法,但是枚举项必须重写该方法

4.枚举的方法

  • String name()获取枚举项的名称
    int ordinal()返回枚举项在枚举类中的索引值
    int compareTo(E o)比较两个枚举项,返回的是索引值的差值
    String toString()返回枚举常量的名称
    static <T> T valueOf(Class<T> type,String name)获取指定枚举类中的指定名称的枚举值
    values()获得所有的枚举项
  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值