美文网首页
类加载&反射

类加载&反射

作者: 行者和他的钢笔 | 来源:发表于2018-09-18 08:40 被阅读11次

1、获得一个类的类对象有哪些方式?

阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的

获取class对象的三种方式:对象获取、类名获取、class类的静态方法获取

字符串需要是包名.类名(全类名)


2、如何通过反射创建对象?

有两种方式:

1.使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。

2.先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例

第一种方法比较常见,在spring这些框架中,会根据配置文件自动创建类的实例并注入到依赖此类的类中。这时候用的最多的就是默认构造器。像是在spring的配置文件中,我们提供的是某个类的全类名,这种情况要创建类的实例,就必须使用反射了。

3、如何通过反射获取和设置对象私有字段的值?

4、如何通过反射调用对象的方法?




5、类加载器加载类

当程序要使用某个类时,虚拟机就会检查这个类在不在内存中,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来将类加载到内存中。

加载

虚拟机启动类加载器将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象

【这个时候就会将class文件放入到内存中的方法区,这个时候加载器还会干一件事就是为这个类创建一个class对象,创建的是一个编译后的class文件的一个对象,该对象会放到堆内存中。这个对象只能由类加载器创建,不能new】

连接

验证【验证,也就是检查类的内部结构】 是否有正确的内部结构,并和其他类协调一致

准备 负责为类的静态成员分配内存,并设置默认初始化值

解析 将类的二进制数据中的符号引用替换为直接引用【方法中有运算,a=1,在这里直接就是1,可以节约资源。也就是说a=1这种符号引用直接替换成1】

初始化 【前边两步:加载和连接是类加载器做的,初始化使我们做的】

就是我们以前讲过的初始化步骤【就是给类创建对象,我们自己创建】

类加载时机,就是什么时候会加载这个类,放到内存中

(1)创建main方法,运行这个类的时候
(2)第二种情况就是使用类中的东西了,比如创建该类的实例、调用这个类的静态成员
(3)初始化某个类的子类(创建子类对象,父类会被先加载)
(4)使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
(5)直接使用java.exe命令来运行某个主类

6、类加载器

作用:

负责将.class文件加载到内在中,并为之生成对应的Class对象。
虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行

类加载器的组成

(1)Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责Java核心类库的加载
比如System类,String类等。在JDK中JRE的lib目录下rt.jar文件中
(2)Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录(文件夹)
(3)System ClassLoader 系统类加载器
负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。【加载我们自己写的类,以及我们添加的第三方的工具类】

7、反射

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

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

反射的作用

我们已经做好一个程序,现在需要进行功能扩充等操作,在不修改源代码的情况下,可以利用反射技术来实现。也就是在程序运行的时候我们可以获取具有新功能类的class文件对象,然后可以调用这个对象中的方法和属性。

一个类的成员有哪些?
方法、构造器、变量

获取class类对象后
解剖类
调用成员

8、通过反射获取构造方法并使用

在反射机制中,把类中的成员(构造方法、成员方法、成员变量)都封装成了对应的类进行表示。其中,构造方法使用类Constructor表示。



public Constructor<?>[] getConstructors() 获取所有的public 修饰(公共)的构造方法
public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(包含私有的)

9、通过反射获取成员变量并使用

10、通过反射获取成员方法并使用

相关文章

  • 类加载&反射

    1、获得一个类的类对象有哪些方式? 阅读API的Class类得知,Class 没有公共构造方法。Class 对象是...

  • 玩转java反射

    原文 类加载器什么是类加载器类加载器的职责类加载器的组成 反射什么是反射如何使用反射反射在Android中的应用 ...

  • 2020-07-04【反射】

    类加载 类加载器 反射概述 获取Class类的对象 反射获取构造方法并使用 反射获取成员遍历并使用 反射获取成员方...

  • 猿学-Java基础教程反射详解

    反射授课目录: ###01_反射(类的加载概述和加载时机) * A:类的加载概述 * 当程序要使用某个类时,如果该...

  • Java学习笔记 27 - 类的加载器、反射

    本文内容介绍1、类加载器2、反射构造方法3、反射成员变量4、反射成员方法5、反射配置文件运行类中的方法 01类加载...

  • 类加载&反射

    public class ClassTest { public static void main(String[]...

  • 学习笔记 | JAVA的反射(二)

    利用反射机制动态加载类 、获取类的方法、获取类的属性 编译时刻加载类是静态加载类,运行时加载类是动态加载类 正常创...

  • 2018-08-30

    Java反射 类的反射方法: new 创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用到的类。 通过动态...

  • Java基础之反射

    Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...

  • 类的加载

    jvm中,类的加载分为:加载+链接+初始化在这个过程中,类的加载少不了类加载器。它与反射功能类似。 类加载器分为启...

网友评论

      本文标题:类加载&反射

      本文链接:https://www.haomeiwen.com/subject/erizpftx.html