Java基础之反射篇
本章是Java基础中的难点和重点!!! 一定要认真学习orz...
一:Java反射机制概述

记住下面的功能!!!


反射相关的主要API

当程序中声明的类(或其他结构,如接口,注解,枚举类等等)加载到内存中后,该类就称为运行时类,而此运行时 类,就可以作为Class类的一个实例。(换句话说,Class的实例就对应着一个运行时类)
二:获取Class的实例
加载到内存中的运行时类,会缓存一定的时间,在此时间内,可以通过不同的方式来获取此运行时类(四种方式):


注:方式三用的频率居多(体现了动态性,编译不会报错,只会在运行时报错)。
Class的实例可以是哪些结构的?

注:只要数组的元素类型与维度(不是长度)一样,就是同一个Class
三:创建运行时类的对象(newInstance方法)

反射的动态性

也就是编译时不知道具体造的是什么类的对象,运行时传入classpath后,才会具体创建相应classpath代表类的对象。提供了代码的通用性。(多用于需要通用性的框架)
四:获取运行时类的完整结构
通过反射,运行时类就相当于Class的一个实例化对象,于是可以通过该对象调用运行时类的各种结构(构造器,方法,属性,注解,权限修饰符,返回值类型,异常等等)
下面提供获取各种结构的方法(getXxx:获取运行时类及其父类声明为public的xxx结构; getDeclaredXxx:获取当前运行时类中声明的所有xxx结构,包括private权限)
(1)获取属性结构

获取属性中更细分的结构

(2)获取方法结构

获取方法中更细分的结构
如获取注解,则注解的声明周期一定是RUNTIME的


获取运行时类的父类

常用:获取带泛型的父类的泛型

获取运行时类实现的接口(动态代理中用到)


(3)调用运行时类中指定的结构:
调用指定的属性:(需要掌握)

调用指定的方法:(需要掌握)
非静态方法被调用(invoke)要传入具体对象p,静态方法被调用可以传入null或者当前类person.class,而不是具体对象p

注意:创建运行时类的实例通常直接用clazz.newInstance(),而不是调用构造器clazz.getDeclaredConstruct(xxx).newInstance()
五:了解类的加载过程



使用Classloader加载src目录下的配置文件(也可以使用字节输入流)

参考:https://www.bilibili.com/video/BV1Kb411W75N?
浙公网安备 33010602011771号