反射和枚举

1.类加载器

1.1类加载器

  • 作用

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

1.2类加载的过程【理解】

  • 类加载时机

  • 创建类的实例(对象)

  • 调用类的类方法

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

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

  • 初始化某个类的子类

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

  • 类加载过程

1.加载

  • 通过包名 + 类名,获取这个类,准备用流进行传输

  • 在这个类加载到内存中

  • 加载完毕创建一个class对象

2.链接

  • 验证

确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全

(文件中的信息是否符合虚拟机规范有没有安全隐患)

  • 准备

负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值

(初始化静态变量)

  • 解析

将类的二进制数据流中的符号引用替换为直接引用

(本类中如果用到了其他类,此时就需要找到对应的类)

3.初始化

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

(静态变量赋值以及初始化其他资源)

  • 小结

  • 当一个类被使用的时候,才会加载到内存

  • 类加载的过程: 加载、验证、准备、解析、初始化

1.3类加载的分类

  • 分类

  • Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null

  • Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块

  • System class loader:系统类加载器,负责加载用户类路径上所指定的类库

  • 类加载器的继承关系

  • System的父加载器为Platform

  • Platform的父加载器为Bootstrap

2.反射

2.1反射的概述

  • 反射机制

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

对于任意一个对象,都能够调用它的任意属性和方法;

这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

2.2获取Class类对象的三种方式

  • 三种方式分类

  • 类名.class属性

  • 对象名.getClass()方法

  • Class.forName(全类名)方法

2.3反射获取构造方法并使用

2.3.1Class类获取构造方法对象的方法
  • 方法介绍

2.3.2Constructor类用于创建对象的方法
  • 方法介绍

2.3.3小结
  • 获取class对象

三种方式: Class.forName(“全类名”), 类名.class, 对象名.getClass()

  • 获取里面的构造方法对象

getConstructor (Class<?>... parameterTypes)getDeclaredConstructor (Class<?>... parameterTypes)

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

  • 如果是非public的,需要临时取消检查,然后再创建对象setAccessible(boolean) 暴力反射

2.4反射获取成员变量并使用

2.4.1Class类获取成员变量对象的方法
  • 方法分类

2.4.2Field类用于给成员变量赋值的方法
  • 方法介绍

2.5反射获取成员方法并使用

2.5.1Class类获取成员方法对象的方法
  • 方法分类

2.5.2Method类用于执行方法的方法
  • 方法介绍

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

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

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

补充:

反射:得到构造方法,属性,方法

1.得到反射的三种方式?

2.对构造方法的调用getConstructor,创建对象newInstance

3.对字段的取值赋值

Object o = aClass.getConstructor().newInstance();

Field address = aClass.getDeclaredField("address");

address.set(o, "12345");

address.get(o)

4.对方法的调用:

Object o = aClass.getConstructor().newInstance();

Method getAa = aClass.getDeclaredMethod("getAa", String.class);

getAa.setAccessible(true);

getAa.invoke(o,"aaaa");//执行方法

5.setAccessible(true);设置可以强制使用

6.无视Declared权限修饰符

7.枚举 赋值用构造方法

8.枚举没有无参数的构造方法,不允许实例化

9.注解:自定义注解:自己定义的注解

元注解:注解上面的注解

10.测试工具类,1.导jar包,2.创建测试类即可

11.复制多继文件夹,和以前删除文件夹类似,

1.对文件进行复制,

2.对文件夹进行创建

3.递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值