Java中的反射

类加载器(1)类的加载当我们的程序在运行后 , 第一次使用某个类的时候 , 会将此类的class文件读取到内存 , 并将此类
的所有信息存储到一个Class对象中 。

Java中的反射

文章插图
 
说明:
a.图中的Class对象是指:JAVA.lang.Class类的对象 , 此类由Java类库提供 , 专门用于存储类的信息 。
b.我们程序中可以通过:"类名.class" , 或者"对象.getClass()"方法获取这个Class对象
(2)类的加载时机a.创建类的实例 。
b.调用类的静态变量 , 或者为静态变量赋值 。
c.调用类的静态方法 。
d.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 。
e.初始化某个类的子类 。
f.直接使用java.exe命令来运行某个主类 。
以上六种情况的任何一种 , 都可以导致JVM将一个类加载到方法区 。
(3)类加载器类加载器:是负责将磁盘上的某个class文件读取到内存并生成Class的对象 。
Java中有三种类加载器 , 它们分别用于加载不同种类的class:
a.启动类加载器(Bootstrap ClassLoader):用于加载系统类库<JAVA_HOME>bin目录下的class , 例如:rt.jar 。
b.扩展类加载器(Extension ClassLoader):用于加载扩展类库<JAVA_HOME>libext目录下的class 。
c.应用程序类加载器(Application ClassLoader):用于加载我们自定义类的加载器 。
【Java中的反射】public class Test{ public static void main(String[] args) {System.out.println(Test.class.getClassLoader());//sun.misc.Launcher$AppClassLoaderSystem.out.println(String.class.getClassLoader());//null(API中说明:一些实现 可能使用null来表示引导类加载器 。如果此类由引导类加载器加载 , 则此方法将在此类实现中返回null 。)}}(4)双亲委派机制
Java中的反射

文章插图
 
上图展示了"类加载器"的层次关系 , 这种关系称为类加载器的"双亲委派模型":
a."双亲委派模型"中 , 除了顶层的启动类加载器外 , 其余的类加载器都应当有自己的"父级类加载器" 。
b.这种关系不是通过"继承"实现的 , 通常是通过"组合"实现的 。通过"组合"来表示父级类加载器 。
c."双亲委派模型"的工作过程:
i. 某个"类加载器"收到类加载的请求 , 它首先不会尝试自己去加载这个类 , 而是把请求交给父
级类加载器 。
ii.因此 , 所有的类加载的请求最终都会传送到顶层的"启动类加载器"中 。
iii.如果"父级类加载器"无法加载这个类 , 然后子级类加载器再去加载 。
(5)双亲委派机制的好处双亲委派机制的一个显而易见的好处是:Java的类随着它的类加载器一起具备了一种带有优先级的层次
关系 。例如:java.lang.Object 。它存放在rt.jar中 。无论哪一个类加载器要加载这个类 , 最终都是委派
给处于顶端的"启动类加载器"进行加载 , 因此java.lang.Object类在程序的各种类加载器环境中都是同一
个类 。
相反 , 如果没有"双亲委派机制" , 如果用户自己编写了一个java.lang.Object , 那么当我们编写其它类
时 , 这种隐式的继承使用的将会是用户自己编写的java.lang.Object类 , 那将变得一片混乱 。
反射的概述(1)反射的引入问题:IDEA中的对象是怎么知道类有哪些属性 , 哪些方法的呢?
答:通过反射技术对象类进行了解剖得到了类的所有成员 。
(2)反射的概念反射是一种机制 , 利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量 , 成员方 法 , 构造方法) 。
(3)使用反射操作类成员的前提要获得该类字节码文件对象 , 就是Class对象 。
(4)反射在实际开发中的应用a.开发IDEA(集成开发环境) , 比如IDEA , Eclipse
b.各种框架的设计和学习 比如Spring , Mybaits....
Class对象的获取方式(1)三种获取方式方式1: 通过类名.class获得
方式2:通过对象名.getClass()方法获得
方式3:通过Class类的静态方法获得: static Class forName("类全名")


推荐阅读