类加载的三种方式

类加载分为动态加载和静态加载。动态加载是从外存储器中加载类,一般类加载机制分析的也是动态加载。而静态加载本质上是从内存中创建类的实例对象,此时类已经被加载到内存中。

一.静态加载

1.

通过new关键字来创建Test的实例对象。

二.动态加载

1.

 通过Class.forName()来加载类,然后调用类的newInstance()方法实例化对象。

2.

  通过类加载器的loadClass()方法来加载类,然后调用类的newInstance()方法实例化对象。

这里有几个需要比较的地方:

1.通过new关键字实例化类的对象和通过Class.forName()加载类是当前类加载器,即this.getClass.getClassLoader,只能在当前类路径或者导入的类路径下寻找类。而用指定的classLoader来加载类可以从当前路径外寻找类,这里的classLoader甚至可以用户自定义。

2.我们知道类加载机制的三个过程主要是加载-->连接-->初始化。Class.forName()实际调用的是Class.forName(className,true,this.getClass.getClassLoader),第二个参数表示加载完后是否立即初始化,第三个参数即前文提到的表示是当前类加载器。classLoader.loadClass()实际调用的是classLoader.loadClass(className,false),第二个参数表示加载完成后是否连接,即用此方法加载类,加载完成后不会去初始化,而用Class.forName()加载类加载完成后可以被初始化。所以有些类如果加载完成后需要立即被初始化则必须使用Class.forName()。例如在加载数据库驱动时,一般用Class.forName("com.mysql.jdbc.Driver")。这是因为该驱动有一个在静态代码块中注册驱动的过程,所以需要被初始化。

3.有两个异常

静态加载类时出现的一般是NoClassDefFoundError。

动态加载类时出现的一般是ClassNotFoundException。

这两者经常被用来比较,其实区别很大。NoClassDefFoundError是错误,不方便被捕捉也不需要被捕捉,不应该尝试从error中恢复程序。他是由于在使用new关键字实例化类的对象时,在内存中找不到对象了,一般比较少见,在运行时发生,即编译时可以找到类运行时却找不到了。而ClassNotFoundException是异常,是可以被捕捉的,应该捕捉并处理尝试恢复程序。这是由于利用类名动态加载类的时候,在外存储器类路径下找不到该类或者其依赖的jar包,还有一个导致其的原因是在同一个包中同一个类被不同的类加载器加载了两遍。

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Hive 是一个基于 Hadoop 的数据仓库系统,能够处理大规模的结构化数据。在 Hive 中使用自定义函数或者存储过程时,常常需要通过 jar 包来实现。以下三种方式是常用的 Hive jar 包的方式。 1. 添 Hive AUX JARS 在 hive-site.xml 或者 hive-config.sh 中,通过配置 hive.aux.jars.path=xxxx 指定 jar 包存储的路径,最终将 jar 包添到 Hadoop 的 ClassPath 中。当 Hive 运行需要 jar 包的任务时,就会从 ClassPath 中 jar 包,避免手动指定 JAR 文件。 2. ADD JAR 命令 使用 ADD JAR 命令将 jar 包添到 Hive 会话中,可以通过全路径、本地路径或 Hadoop HDFS 路径来指定。例如 ADD JAR hdfs:///example/hive/hive-test.jar; 3. 使用命令行参数 启动 Hive 命令时,可以通过指定 –hiveconf hive.aux.jars.path=xxxx 指定 JAR 文件的路径,启动 Hive 命令同时就会将 JAR 文件入到 ClassPath 中。 总之,在使用 Hive时,要根据实际情况选择合适的方式 JAR 包,避免出现错误。 ### 回答2: 在Hive中jar包有多种方式,以下列举其中三种: 1. 添hive自定义类路径 在hive-site.xml文件中,将Hive的自定义类路径hive.aux.jars.path设置成需要的jar包所在路径,即可将jar包入Hive的classpath中,方便调用自定义函数等操作。示例: <property> <name>hive.aux.jars.path</name> <value>/path/to/jar1:/path/to/jar2</value> </property> 2. 使用ADD JAR命令 在Hive的交互式终端或执行脚本时,使用ADD JAR命令将需要的jar包添到Hive的classpath中。该命令会将jar包复制到Hive的临时文件夹中,可以通过system:java.io.tmpdir查看该路径。示例: ADD JAR /path/to/jar1; ADD JAR /path/to/jar2; 3. 在创建自定义函数时指定jar包路径 在创建自定义函数时,可以将需要的jar包路径直接指定到函数的CLASSPATH选项中。示例: CREATE TEMPORARY FUNCTION my_func AS 'com.package.MyFunc' USING JAR '/path/to/jar1'; 以上三种方式中,第一种和第二种可以将jar包持久地添到Hive的classpath中,方便后续多个脚本或交互式终端使用;第三种方式则适用于只在当前会话使用自定义函数的情况。 ### 回答3: Hive 是一个基于 Hadoop 的数据仓库工具,它可以将结构化的数据以 SQL 的方式进行查询和分析。在 Hive 中,用户可以使用自定义的 UDF(用户定义函数),以扩展 Hive 的功能。 说到 Jar 包,Hive 有以下几种方式: 1. ADD JAR:通过 ADD JAR 命令将本地路径的 Jar 包到 Hive 中。 例如: ADD JAR /usr/local/hive/UDF/hive-udf.jar; 2. ADD ARCHIVE:通过 ADD ARCHIVE 命令将一个包含多个 Jar 包的 tar.gz 归档文件到 Hive 中。 例如: ADD ARCHIVE /usr/local/hive/UDF/hive-udf.tar.gz; 3. 在 Hive 配置文件中添 Jar 包路径:在 Hive 的配置文件中,添 Jar 包所在的路径,如下: hive.aux.jars.path=file:///usr/local/hive/UDF/hive-udf.jar 4. 使用命令行选项 "-hiveconf":在启动 Hive 前,使用 -hiveconf 命令行选项指定 Jar 包路径。 例如: $ hive -hiveconf hive.aux.jars.path=file:///usr/local/hive/UDF/hive-udf.jar 以上是 Hive Jar 包的几种方式,根据不同的需求,选择合适的方式即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值