Class.forName用法

简介:
反射机制必定用到Class.forName 这个方法。上周有个同事在分享这块的时候延展的谈到了Class.forName的一些用法。
1、Class.forName(String className);
2、Class.forName(String name,boolean initialize,ClassLoader loader);
通常大家都会认为,某个类中的static初始化区块都是在 类加载 的时候就被调用到唯一的一次。真的是这样么?带着这个问题,我们来看看Class.forName这个方法。
Java代码 
  1. public class Word {
  2. static{
  3. System.out.println(“Word Init….”);
  4. }
  5. }
  6. public class Test {
  7. public static void main(String[] args) {
  8. try{
  9. Class cls = Class.forName(“Word”,false,ClassLoader.getSystemClassLoader());
  10. }catch(Exception e){
  11. e.printStackTrace();
  12. }
  13. }
  14. }
  15. public class Test1 {
  16. public static void main(String[] args) {
  17. try{
  18. Class cls = Class.forName(“Word”,true,ClassLoader.getSystemClassLoader());
  19. }catch(Exception e){
  20. e.printStackTrace();
  21. }
  22. }
  23. }
类Test和Test1运行的结果不一样:
Test:
Test1:Word Init…
为什么会这样?
Class.forName中的第二个参数在发生着作用。
不管用new还是class.forName来产生实例都隐含着两个部分:类加载+静态初始化区块调用;
静态初始化区块是在newInstance()的时候才被真正调用,所以Class.forName的第二个参数“false”的时候,定义不需要调用静态初始化区块,这就是为什么产生如上结果的原因了。
给一些应聘来工程师问这个问题,大家的回答多为静态初始化区块在类加载的时候被调用的。真正的是: 静态初始区块并不是类加载的时候就调用,而是在第一次实例化的时候真正被调用 。









本文转自 神相 51CTO博客,原文链接:http://blog.51cto.com/shenxiang/269185,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
Java 数据安全/隐私保护
java中public、private、protected作用范围
该内容是关于Java中访问修饰符的范围总结:`public`(全局访问)、`protected`(同包及子类访问)、默认(同包访问)、`private`(仅本类访问)。
64 6
|
缓存 安全 Java
【JAVA】String 类 下
【JAVA】String 类
|
1月前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
25 3
java基础(4)public class 和class的区别及注意事项
|
2月前
|
Java 测试技术 Docker
记录一次很坑的报错:java.lang.Exception: The class is not public.
这篇文章记录了作者在Docker中运行服务进行单元测试时遇到的一系列问题,包括Spring Boot与Spring Cloud版本不一致、Bean注入问题、测试单元引入问题以及公共类和方法的可见性问题,并提供了解决问题的方法和成功测试通过的代码示例。
记录一次很坑的报错:java.lang.Exception: The class is not public.
|
4月前
|
Java
Class.forName()方法总结
Class.forName()方法总结
|
5月前
|
IDE Java Unix
Java的class path的设置与应用
Java的class path的设置与应用
|
5月前
|
存储 Java 编译器
Java String 类
4月更文挑战第14天
|
5月前
|
Java
java-基础-Interface、abstract类、Static class 、non static class的区别
【4月更文挑战第5天】Java中的接口、抽象类、静态类和非静态类各具特色:接口仅含抽象方法和常量,用于定义行为规范;抽象类可包含抽象和非抽象方法,提供部分实现,支持多继承;静态内部类不依赖外部类实例,可独立存在,访问外部类的静态成员;非静态内部类持有关联外部类引用,能访问其所有成员。这些机制根据设计需求和场景选择使用。
45 6
|
5月前
|
Java
Class.forName和ClassLoader到底有啥区别
Class.forName和ClassLoader到底有啥区别
25 0
|
存储 Java 编译器
Java-关于main函数的修饰符(为什么要带public和static)
关于Java主函数的修饰符(为什么要带public和static) public修饰符 public是函数的权限,决定了该函数是否可以被外部的函数调用