必威体育Betway必威体育官网
当前位置:首页 > IT技术

classs.forname

时间:2019-10-25 07:15:33来源:IT技术作者:seo实验室小编阅读:66次「手机版」
 

class.forname

这里写自定义目录标题

    • *

调用次函数时完成的事情很多:

   public static Class<?> forName(String className)
                throws ClassnotfoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }
    • Returns the {@code Class} object associated with the class or
      • interface with the given string name, using the given class loader.
      • Given the fully qualified name for a class or interface (in the same
      • format returned by {@code getName}) this method attempts to
      • locate, load, and link the class or interface. The specified class
      • loader is used to load the class or interface. If the parameter
      • {@code loader} is null, the class is loaded through the bootstrap
      • class loader. The class is initialized only if the
      • {@code initialize} parameter is {@code true} and if it has
      • not been initialized earlier.
  1. ~~

*

> native的方法: private static native Class<?> forName0(String name,
> boolean initialize, ClassLoader loader, Class<?> caller) throws
> ClassNotFoundException;

~~

parameter is {@code true} :会导致类的初始化:会执行类里的静态代码块,为静态变量赋予正确的初始值等等

**
  • 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
  • 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageERROR错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
  • 类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

– 创建类的实例,也就是new的方式

– 访问某个类或接口的静态变量,或者对该静态变量赋值

– 调用类的静态方法

– 反射(如class.forname(“com.shengsiyuan.Test”))

– 初始化某个类的子类,则其父类也会被初始化

java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类

  • 类加载有三种方式:

    1、命令行启动应用时候由JVM初始化加载

    2、通过Class.forName()方法动态加载

    3、通过ClassLoader.loadClass()方法动态加载

Class.forName()和ClassLoader.loadClass()区别

  • Class.forName():将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块;
  • ClassLoader.loadClass():只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newinstance才会去执行static块。

调用一个类的静态变量不会导致被调用类的初始化

在这里插入图片描述

**程序中主动使用了Driver类,则会加载其中的静态代码块。其中又调用了java.sql.DriverManager的方法,则会使java.sql.DriverManager类加载,连接和初始化。

在这里插入图片描述

执行static声明的代码

注:jdk11与jdk8 此处有差别,jdk11中没有这个静态代码块。但是在Connection conn = DriverManager.getConnection(…)即DriverManager类的getConnection方法中包含ensureDriversInitialized()方法,此方法来确保加载mysql驱动

在这里插入图片描述

  • List item

文章最后发布于: 2019-04-27 15:24:10

相关阅读

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

https://blog.csdn.net/Terminator2015/article/details/52123388 原地址所有的类都是在对其第一次使用时,动态加载到JVM。当程序

Class.forName()、Class.forName().newInstance() 、N

在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )

Class.forName与Class.class区别

1.首先我们定义一个基类Basepublic class Base { static int num = 1; static { System.out.println("Base

分享到:

栏目导航

推荐阅读

热门阅读