类加载的三种方式比较(代码片段)

Alamps沁园春 Alamps沁园春     2022-10-23     324

关键词:

虚拟机加载类的途径
1、由 new 关键字创建一个类的实例
在由运行时刻用 new 方法载入
如:Dog dog = new Dog();
2、调用 Class.forName() 方法
通过反射加载类型,并创建对象实例
如:Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
3、调用某个 ClassLoader 实例的 loadClass() 方法
通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
如:Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();
三者的区别:
1和2使用的类加载器是相同的,都是当前类加载器。(即:this.getClass.getClassLoader)。3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。第3种方式加载的类与当前类分属不同的命名空间。另外,1是静态加载,2、3是动态加载

两个异常(exception)
静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error
动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常

Class.forName与ClassLoader.loadClass区别
Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize).
Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。第二个参数,是指Class被loading后是不是必须被初始化。
ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指Class是否被link。
Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
例如,在JDBC编程中,常看到这样的用法,Class.forName(“com.mysql.jdbc.Driver”).
如果换成了getClass().getClassLoader().loadClass(“com.mysql.jdbc.Driver”),就不行。
com.mysql.jdbc.Driver的源代码如下:
// Register ourselves with the DriverManager
static 
try 
java.sql.DriverManager.registerDriver(new Driver());
 catch (SQLException E) 
throw new RuntimeException(“Can’t register driver!”);


原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。
所以这个地方就只能用Class.forName(className)。

 

ef的三种数据加载方式(代码片段)

EF的关联实体加载有三种方式:LazyLoading,EagerLoading,ExplicitLoading,其中LazyLoading和ExplicitLoading都是延迟加载。(一)延迟加载(默认):LazyLoading使用的是动态代理,默认情况下,如果POCO类满足以下两个条件,EF就使用LazyLoading:POCO... 查看详情

获得类的字节码对象的三种方式(代码片段)

...xxx.java)通过编译后形成字节码文件,字节码文件通过类加载器获得字节码对象,通过字节码对象可以操作源码中的属性和方法。方式一,使用类的class属性: Class<java.util.Date>clazz1=java.util.Date.class; 方式二,通过Class... 查看详情

bean无法被注入的常见问题和springboot的三种扫描并加载bean方式(代码片段)

一、bean无法被注入的常见问题某个类中的成员,如果是采用@Autowired注入SpringBean,则当前类的实例,必须也是SpringBean才能成功注入,即该实例不能用newxxx()来获得,这种方式获得的实例无法调用@Autowired... 查看详情

python读取文件内容的三种方式并比较(代码片段)

本次实验的文件是一个60M的文件,共计392660行内容。程序一:defone():start=time.clock()fo=open(file,‘r‘)fc=fo.readlines()num=0forlinfc:tup=l.rstrip(‘\n‘).rstrip().split(‘\t‘)num=num+1fo.close()end=time.clock()printend-startprin 查看详情

spring-di的三种实现方式以及优劣(代码片段)

文章目录Spring-DI的三种实现方式以及优劣设值注入构造方法注入接口注入三种实现方式的比较构造方法注入优点缺点设值注入优点缺点Spring-DI的三种实现方式以及优劣从现在起,master分支切换为JavaEE,80%的时间都花在JavaEE上面... 查看详情

并发编程(壹):创建线程的三种方式及其对比(代码片段)

创建线程的三种方式及其对比1.继承Thread类(1).继承Thread类。并重写run()方法,该方法无参数,无返回值;(2).创建子类实例,并实例化对象;(3).通过start()方法启动,注意:不是通过run()方法启动。publicclassThreadDemoextendsThreadpublicvoid... 查看详情

python创建虚拟环境的三种方式(代码片段)

Python创建虚拟环境的三种方式比较Python创建虚拟环境的三种方式首先:为什么需要虚拟环境?PipenvvsVirtualenvvsConda1.Virtualenv2.Pipenv3.Conda参考资料Python创建虚拟环境的三种方式首先:为什么需要虚拟环境?在使用Python... 查看详情

java多线程实现的三种方式(代码片段)

文章目录实现多线程方式一:继承Thread类方法介绍实现步骤代码演示思考问题实现多线程方式二:实现Runnable接口Thread构造方法实现步骤代码演示实现多线程方式三:实现Callable接口方法介绍实现步骤代码演示三种实现方式... 查看详情

java反射获取class对象的三种方式,反射创建对象的两种方式(代码片段)

Java反射获取class对象的三种方式,反射创建对象的两种方式1、获取Class对象在JavaAPI中,提供了获取Class类对象的三种方法:第一种,使用Class.forName静态方法。前提:已明确类的全路径名。第二种,使用.class方法。说明:仅适合... 查看详情

flink在yarn上支持的三种部署方式及使用方式(代码片段)

...的Hadoop配置文件都是通过HADOOP_CLASSPATH环境变量从类路径加载的。2Flink在YARN上支 查看详情

实现自定义view的三种方式(代码片段)

...来实现测量、布局以及draw流程。所以,在实现自定义view的三种方式中,这一种相对比较简单。   &nbs 查看详情

spring的三种基于xml的注入方式110401(代码片段)

目录 1.构造函数方式注入这里是主函数这里是applicationContext.xml主配置文件真正的Dao层的实现代码UserServiceImpl实现类2.(1)set方法注入(常用)applicationContext.xml(注入一般类型,引用类型) UserServiceImp... 查看详情

线程的三种实现方法(代码片段)

线程的三种实现方法:(1)继承Thread类,重写run()方法;(2)实现Runnable接口,重写run()方法;(3)实现Callable接口,重写call()方法;方式一: 继承Thread类publicclassMyThreadDemopublicstaticvoidmain(String[]args)Threadthread=newMyThread();thread.... 查看详情

日期处理的三种方式(代码片段)

一:使用注解的方式@JsonFormat注解该注解加在实体类中的日期类型上,可以将返回的Json字符串中的时间戳转换为具体时间@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")privateDateupdateTime;?我们通过使用@JsonFormat可以很好的解决:后台到... 查看详情

spring常用的三种注入方式(代码片段)

好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。构造方法注入先简单了解一下测试项... 查看详情

检测数据类型的三种方式及区别(代码片段)

vara="iamstring";varb=[1,2,3];varc=newString("abc");//String类实例对象//typeof:null对象数组都是返回Object类型console.log(typeofa);//stringconsole.log(typeofb);//objectconsole.log(typeofc);//object//instanceof无法检测是字符 查看详情

面试题:增强一个对象的方法的三种方式(代码片段)

面试题:增强一个对象的方法的三种方式1.继承使用这种方式必须满足的条件是:被增强的方法的所在类能被继承,并且这个对象已经明确知道。举例:有一个接口Person,里面有一个方法run()packagecom.itzhouq.demo1;publicinterfacePerson... 查看详情

产生随机数的三种方式(代码片段)

1. java.util.Random  java.util.Random类提供了以下产生随机数的方法:  (1)通过Random()构造方法实例化的对象产生随机数   Randomr=newRandom();       特点:每次运行产生的随机数都不一样。  (2)通过R... 查看详情