java的反射机制Class.forName()

2023-11-16

Class.forName 方法的作用,就是初始化给定的类。

1.Class 类概念

Class 也是一个 Java 类,保存的是与之对应 Java 类的 meta信息(元信息),用来描述这个类的结构,比如描述一个类有哪些成员,有哪些方法等,一般在反射中使用。

详细解释:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例(Class 对象)。也就是说,在 Java 中,每个 java 类都有一个相应的 Class 对象,用于表示这个 java 类的类型信息。

2.类加载概念

当使用一个类的时候(比如 new 一个类的实例),会检查此类是否被加载到内存,如果没有,则会执行加载操作。

读取类对应的 class 文件数据,解析此数据,构造一个此类对应的 Class 类的实例。此时JVM就可以使用该类了,比如实例化此类,或者调用此类的静态方法。

Java 也提供了手动加载类的接口,class.forName()方法就是其中之一。(说来说去,其实就是生成这个类的 Class)

3.加载器的概念

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。 基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。

4.类初始化概念

类被加载之后,jvm 已经获得了一个描述类结构的 Class 实例。但是还需要进行类初始化操作之后才能正常使用此类,类初始化操作就是执行一遍类的静态语句,包括静态变量的声明还有静态代码块。

Class.forName() 方法

此方法含义是:加载参数指定的类,并且初始化它。
在 jdbc 连接数据库中的应用
到这里,不用解释,读者也会明白,在使用 jdbc 方式连接数据库时,为什么要执行 Class.forName(‘驱动类名’) 方法了:将驱动类的 class 文件装载到内存中,并且形成一个描述此驱动类结构的 Class 类实例,并且初始化此驱动类,这样 jvm 就可以使用它了,这就是 Class.forName() 方法的含义。

有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用 newInstance() 方法呢?即有的 jdbc 连接数据库的写法里是 Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?

刚才提到,Class.forName(""); 的作用是要求 JVM 查找并加载指定的类,如果在类中有静态初始化器的话,JVM 必然会执行该类的静态代码 段。而在 JDBC 规范中明确要求这个 Driver 类必须向 DriverManager 注册自己,即任何一个 JDBC Driver 的 Driver 类的代码都必须类似如下:

public class MyJDBCDriver implements Driver { 
    static { 
        DriverManager.registerDriver(new MyJDBCDriver()); 
    } 
} 

既然在静态初始化器的中已经进行了注册,所以我们在使用 JDBC 时只需要 Class.forName(XXX.XXX); 就可以了。

5.Class.forName() 与 xxx.class的区别

所有的类都是在对其第一次使用时,动态加载到 JVM。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这也证明了构造器也是类的静态方法,即使在构造器之前并没有 static 关键字。因此,使用 new 操作符创建类的对象也会被当作对类的静态成员的引用。

因此 Java 程序在他开始运行之前并非被完全加载,其各个部分是在需要时才加载的。

类加载器首先验证这个类的 Class 对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名称查找 .class 文件。在这个类的字节码被加载时,它们会接收验证,以确保其没有被破坏。

Class 对象仅在需要的时候才被加载。static 初始化是在类加载时进行的。

对于 Class.forName(),这个方法是 Class 类的一个 static 成员。Class 对象就和其他对象一样,我们可以获取并操作他的引用。forName() 是取得 Class 对象引用的一种方法。他是用一个包含目标类的文本名的 String 作为输入参数,返回一个 Class 对象的引用。forName() 方法发现某个累还没被加载,就会主动去加载这个类,在加载过程中,该类的是 static 子句将会被执行。
Java 还提供了另一种方法来生成对 Class 对象的引用,即使用类字面常量。形如:xxx.class 的形式。但是这种形式创建 Class 对象引用时,不会自动初始化 Class 对象。初始化被延迟到了对静态方法或者非常数静态域首次引用时才执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java的反射机制Class.forName() 的相关文章

  • string.split("(?!^)") 解释

    我正在尝试将字符串的字符拆分为字符串数组 我找到了解决方案here https stackoverflow com questions 5235401 split string into array of character strings
  • 创建通用数组时出错

    public class TwoBridge implements Piece private HashSet
  • Google App Engine 数据存储写入:如何远程启用/禁用只读模式?

    在阅读备份时GAE 的数据存储 https developers google com appengine docs adminconsole datastoreadmin where 我们强烈建议您在备份或恢复期间将应用程序设置为只读模式
  • Java中如何合并两个数组?

    它不是连接而是合并两个数组 使它们成为名称值对的数组 firstarray a aa aaa secondarray b bb bbb result a b aa bb aaa bbb 最好的方法是什么 in Java public sta
  • Spring MVC - 自动查找验证器

    假设我有一个像这样的示例实体类 public class Address 和相应的验证器 Component public AddressValidator implements Validator Override public bool
  • java中%%是什么意思?

    我是一名 PHP 程序员 想知道这行代码的含义 System out printf exp 3f is 3f n x Math exp x 3f 3f n 和逗号 x 是什么意思 它与C类似printf http java sun com
  • 我从 String placeName = placeText.getText().toString(); 收到空指针异常

    您好 想从编辑文本中获取地名并在地图上标记 这是我的代码 其中出现空指针异常 请帮助我应该做什么以及哪里出错了 因为我从对话框中的编辑文本字段获取地名 View layout View inflate this R layout alert
  • 如何对 jar 文件资源使用 File.separator?

    我正在尝试读取位于 jar 文件中的属性文件 我想使用 File separator 因为应用程序将在多个平台上运行 我正在构建路径如下 jarFilePath jar file jarFile getAbsolutePath jarPro
  • Mockito mockStatic 无法解析符号

    我正在使用 Spring Boot 并在单元测试中 我试图模拟Files delete myFile toPath method 为此 我尝试使用Mockito mockStatic 方法 但是当我尝试使用它时 我的 IDE Intelli
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 检查更新时 Maven 无限期挂起

    我正在使用 Maven 构建一个项目 我是新手 并且它挂起 mvn package INFO Scanning for projects INFO INFO Building Presentation Reports INFO task s
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 如何根据从 jtextfield 和组合框接收的值将数据行添加到 Jtable

    我有一个JFrame表格有JTextFields JCombobox等等 我能够将这些值接收到变量 现在我想将接收到的数据添加到JTable当用户单击 添加 或类似的操作时在新行中 我创造了JTable使用 net beans 的问题是将这
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa

随机推荐

  • c++ 用vs2019编译mxnet1.9.0

    一 编译环境之windows10 编译出动态库libmxnet dll libmxnet lib mxnet 70 lib及include头文件 一 环境及依赖 1 Windows10 2 Cuda11 1 3 Cudnn8 1 0 77
  • LDA 学习笔记

    1 LDA算法的介绍 1 1 算法的基本知识 隐含狄利克雷分布 Latent Dirichlet Allocation LDA 和机器学习中的线性判别分析 Linear Discriminant Analysis 不一样 首先是对狄利克雷分
  • 12346678

  • TQ210烧写uboot secureCRT和minicom都没有信息输出

    前几天一直在纠结TQ210烧写uboot 串口没有信息打印信息输出 结果又是这样的 说明波特率 串口号都是正确的 开发板一上电 按住空格键 结果还是一样 本以为是这个软件是破解版 有BUG 好 切换到LINUX 使用minicom 试试 还
  • m个苹果放入n个盘子

    题目描述 把M个同样的苹果放在N个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 用K表示 5 1 1和1 5 1 是同一种分法 输入 每个用例包含二个整数M和N 0 lt m lt 10 1 lt n lt 10 样例输入 7
  • mybatis的环境搭建

    mybatis的环境搭建 1 创建maven工程并导入坐标 创建mybatis需要的依赖有下面几个
  • vue H5页面跳转小程序及其传参小程序并接收

    第一次做H5跳转小程序 记录一下 代码前的配置不多说看文档 目录 微信开放文档 这里我们用到开放标签 跳转小程序 wx open launch weapp 使用之前需要在入口文件pubilc目录下index html文件下引入jssdk h
  • 使用Hexo 配置自己的博客

    安装前提 在Windows下可以到git官网 推荐使用代理 或者对应的镜像网站进行下载 安装git客户端 安装node js 使用git bash 安装 cURL curl https raw github com creationix n
  • Zotero:按GB/T7714 2015引用参考文献

    欢迎关注 ManTou馒头公众号 原创不易 转载请注明出处 点赞收藏再走 主要解决引用英文文献作者超过3个时出现 等 而不是 etal 的问题 Zotero 按GB T7714 2015引用参考文献 导入China National Sta
  • 剖析vue常见问题(一)之v-for与v-if的优先级

    背景 vue中经常使用到v for和v if 那么它们的优先级是怎么样的呢 怎么才能实现性能优化呢 下面来简单分析一下 如何分析 请参考以下测试demo 以及源码中参考src compiler codegen index js demo代码
  • 棋盘覆盖问题-递归分治

    输入 3 3 4 输出 如图 x 3 y 3代表特殊方块的坐标 坐标原点在坐标系左上角 如图也就是一个 size 4 的L型骨牌的棋盘覆盖问题 include
  • maven集成cucumber,mvn test单元测试不运行

    maven集成cucumber mvn test单元测试不运行 项目已集成cucumber jacoco测试覆盖率100 在application项目添加单元测试 覆盖率下降 发现单元测试覆盖的语句覆盖率没有统计到 经试验 发现是appli
  • Java Web工程中的web.xml配置文件

    Java Web工程中的web xml配置文件 前言 1 xml文件 xml文件 Extentsible Markup Language即可扩展标记语言 是用来定义其它语言的一种元语言 其前身是SGML 标准通用标记语言 xml文件是互联网
  • vue axios 跨域,携带cookie

    前端设置 axios 跨域 const axios require axios axios defaults withCredentials true 后端设置 express app use function req res next r
  • 宏函数、普通函数、内联函数的区别

    示例代码 宏函数 define SUM x x x 内联函数 inline int sum int x return x x 普通函数 int sum int x return x x 什么是内联函数 在普通函数定义时加上 inline 关
  • TCP/IP 协议——知识集锦

    精通 TCP IP 熟练使用 Socket 进行网路编程 这句话在招聘要求里经常见 但是平时压根用不到 虽然笔者用Unity3D 如果做联网需要用到Socket通信 奈何我还没做过网络游戏 这里补下相关知识 目录 1 什么是 TCP IP
  • Java——3.字符串的替换和去除空格操作_replace ()和 trim ()方法

    程序开发中 用户输入数据时经常会有一些错误和空格 这时可以使用 String 类的 replace 和 trim 方法 进行字符串的替换和去除空格操作 ExampleAPI04 public class ExampleAPI04 publi
  • tf卡低级格式化_tf卡写保护怎么去掉 磁盘被写保护解决方法

    今天智智教大家如何去除TF卡写的保护 MicroSD 卡是一种极细小的快闪存储器卡 原本这种记忆卡称为T Flash 有时候我们会遇到tf卡写保护的情况 要解除写保护 先确认一下是否真的被写保护 鼠标右键点击移动硬盘 属性 看看你的文件属性
  • R语言中使用dplyr包进行排序与添加序号的实战

    R语言中使用dplyr包进行排序与添加序号的实战 在R语言中 dplyr是一个非常强大的数据处理包 它提供了一套简洁而一致的函数 用于对数据进行筛选 排序 汇总和变形等操作 本文将介绍如何使用dplyr包进行排序 并为数据添加序号 首先 让
  • java的反射机制Class.forName()

    Class forName 方法的作用 就是初始化给定的类 1 Class 类概念 Class 也是一个 Java 类 保存的是与之对应 Java 类的 meta信息 元信息 用来描述这个类的结构 比如描述一个类有哪些成员 有哪些方法等 一