黑马程序员--类加载器小结

从三个角度理解知识图谱 2012年谷歌首次提出“知识图谱”这个词,由此知识图谱在工业界也出现得越来越多,对于知识图谱以及相关概念的理解确实也是比较绕。自己在研究大数据独角兽Palantir之后开始接触知识图谱,也算对其有了一定了解,这里从三个角度总结一下怎么去理解知识图谱。 几个基本概念:本体、实体、知识库、知识图谱 1、本体是概念的集合,是大家都公认的概念框架,一般不会改变如“人”、“事”、“物”、 “地”、“组... 阅读详情

---------------------- android培训、java培训、期待与您交流! ----------------------

类加载器基本概念

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。

基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。

 

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:

  • 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader() 来获取它。

除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。

加载类的过程

完成类的加载工作是通过调用 defineClass 来实现的;而启动类的加载过程是通过调用 loadClass 来实现的。前者称为一个类的定义加载器(defining loader),后者称为初始加载器(initiating loader)。在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载器。两种类加载器的关联之处在于:一个类的定义加载器是它引用的其它类的初始加载器。如类com.example.Outer 引用了类 com.example.Inner,则由类 com.example.Outer 的定义加载器负责启动类com.example.Inner 的加载过程。

方法 loadClass() 抛出的是 java.lang.ClassNotFoundException 异常;方法defineClass() 抛出的是java.lang.NoClassDefFoundError 异常。

类加载器在成功加载某个类之后,会把得到的 java.lang.Class 类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。也就是说,对于一个类加载器实例来说,相同全名的类只加载一次,即loadClass 方法不会被重复调用。

如何自定义一个类加载器

基本原则 定一个类,继承ClassLoader, 复写该类的findClass()方法。

package cn.itcast.day1;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class MyClassLoader extends ClassLoader {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  //ClassLoaderDemo cld = new ClassLoaderDemo();
  //System.out.println(cld);
  String srcPath = args[0];
  String destDir = args[1];
  
  FileInputStream fis = new FileInputStream(srcPath);
  String destFileName = srcPath.substring(srcPath.lastIndexOf("\\")+1);
  String destPath = destDir+"\\"+destFileName;
  //String destFileName =
  FileOutputStream fos = new FileOutputStream(destPath);

  encrypt(fis,fos);
 
  //fis.close();
  //fos.close();
 }
 
 public static void encrypt(InputStream is, OutputStream os) throws Exception
 {
  int b = -1;
  while((b=is.read())!= -1)
  {
   os.write((byte)b ^ 0xff);
  }
 }
 
 private String classDir;
 
 public MyClassLoader() {
  
 }
 public MyClassLoader(String classDir) {
  
  this.classDir = classDir;
 }

 
 @Override
 protected Class<?> findClass(String name) throws ClassNotFoundException {
  // TODO Auto-generated method stub
  String classFileName = classDir +"\\"+name+".class";
  try {
   FileInputStream fis = new FileInputStream(classFileName);
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   encrypt(fis,baos); 
   
   byte[] bytes = baos.toByteArray();
   return defineClass(bytes, 0, bytes.length);
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  
  //encrypt(is,os);
  return super.findClass(name);
 }
  

---------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.youkuaiyun.com/heima 

Ubuntu20.04下Docker无缝升级实战指南 本文提供了一份在Ubuntu20.04系统上安全、无缝升级Docker的实战指南。文章详细阐述了升级前的版本检查、数据备份等准备工作,逐步演示了通过APT包管理器进行升级或指定版本安装的操作步骤,并强调了升级后的验证与常见问题回滚方案,确保业务容器平稳过渡。 阅读详情

相关推荐

锁定放大器

锁定放大器

qq_46757048的博客 4706

黑马程序员_类加载器小结

----------android培训、java培训、期待与您的交流----------

td920217的专栏 705

CAN:CANape使用Function处理数据

CANape中的function and script习惯称之为脚本(实际为函数和脚本)。这里介绍function,可以实现简单信号a和信号b乘法,比如计算功率(转速与扭矩乘)。该功能前期有专业人员做支援,当时问其编制方法,其回答是看帮助文件。现在没有支援自己动手。 功能描述:电压信号阶梯增加,每次保持1.5s,测量后0.5s位移平均值(假设信号步长10ms,需要取样50个点,但该脚本中点的数目为10个)。图示如下: 刚开始看了软件Function definition→Library function,

Morven 1万+

【Java EE】类加载器&反射 —— 黑马程序员

1.类加载器 1.1类加载器【理解】 作用 负责将.class文件(存储的物理文件)加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例(对象) 调用类的类方法 访问类或者接口的类变量,或者为该类变量赋值 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 直接使用java.exe命令来运行某个主类 类加载过程 加载 通过包名 + 类名,获取这个类,准备用流进行传输 在这个类加载到内存中 加载完毕创建一个class对象

学无止境 349

从TTL到RS485:一颗CH342芯片搞定三种串口通信的硬件连接实战

本文详细介绍了CH342芯片在TTL、RS232和RS485三种串口通信模式下的硬件连接实战。通过精选的电路设计示例和配置技巧,展示了CH342在工业控制和智能硬件开发中的灵活应用,帮助开发者高效实现多协议通信,显著提升项目开发效率。

weixin_30709061的博客 506

手把手教你学PCIE-- 热插拔电路设计与实现方案

PCIe热插拔(Hot-Plug)技术允许用户在系统运行时安全地插入或移除设备,而无需重启系统。本文将深入讲解热插拔电路的设计要点、关键器件选型及信号协议规范,涵盖机械结构、电气保护和电源管理三大核心模块。​。

MHD0815的博客 440

黑马程序员_Anotation小结

定义:类加载器负责加载 Java 类的字节代码到 Java 虚拟机中

td920217的专栏 589

轴承故障诊断领域的论文到底有多水

这个是最让人困惑的,就好像你说自己证明了某个方法更好,但是你却没有交代自己怎么做的,或者说你交代的过程有外行话或者逻辑上的缺陷,但是你就这么给出个结果完事了。由于自己没有足够大的学术交流圈子,为了尽量避免误判,我在原来13篇论文的基础上又读了18篇,这些论文至少都出自中文核心,有一些还有EI的title,事实上近几年能找到的文章也不算多,这些基本能说明问题了。当然,还有更多细节,比如说损失函数你得交代吧,模型超参数得介绍全吧,至少数据集是哪个工况下的得说吧,当你想复现这些论文,关注点在这些地方的时候。

weixin_50642818的博客 3052

黑马程序员——mysql——day05——反射、注解、动态代理

目标了解反射技术的作用 【了解】讲解反射的概述反射技术的作用目标能够理解注解在程序中的作用 【了解】讲解什么是注解注解的作用目标能够熟悉自定义注解的格式 【会用】讲解注解的定义格式定义带有属性的注解定义注解使用关键字:@interfacepublic @interface 注解名{//内容注解本质上就是一个接口。所有注解都会继承一个接口:Annotationpublic interface 自定义注解名 extends java.lang.annotation.Annotation {}概念。

qq_56444564的博客 976

华为OD机试 双机位C卷:微服务的集成测试 (C/C++/Py/Java/JS/Go)

华为OD机试 双机位C卷 :微服务的集成测试 ,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 微服务的集成测试 , 华为OD 微服务的集成测试

qq_45776114的博客 2066

基于STM32、HAL库的 CH9102X USB转UART收发器 驱动程序设计

/ 或 UART_HWCONTROL_RTS_CTS。// 其他函数实现类似,使用HAL_UART_Transmit_IT, HAL_UART_Receive_IT等。UART_TXD <---> USARTx_RX (STM32接收)UART_RXD <---> USARTx_TX (STM32发送)* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。* @param huart: UART句柄指针。

corlin6688的博客 506

day36-类加载器

基础加强包含了:反射,动态代理,类加载器,xml,注解,日志,单元测试等知识点其中最难的是反射和动态代理,其他知识点都非常简单由于B站P数限制,xml,注解等知识点,阿玮写了详细文档供大家学习。

2401_89213165的博客 699

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 378

"黑马程序员"张老师Java高新技术学习(注解、类加载器)

----------------- android培训、java培训、期待与您交流! ----------------------注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加

wcqlwyt的博客 151

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

"黑马程序员"张老师Java高新技术学习(注解、类加载器)

----------------- android培训、java培训、期待与您交流! ---------------------- 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上

tangjinjava的专栏 544

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

黑马程序员——mysql——day06——XML、Dom4j、综合案例

什么是XML英文:eXtensible Markup Language 可扩展的标记语言,由各种标记(标签,元素)组成。可扩展:所有的标签都是自定义的,可以随意扩展的。如:,标记语言:整个文档由各种标签组成。清晰,数据结构化!XML是通用格式标准,全球所有的技术人员都知道这个东西,都会按照XML的规范存储数据,交互数据!!XPath使用路径表达式来选取XML/HTML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。

qq_56444564的博客 1339

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

黑马程序员 【】java学习之路——代理小结

-------android培训、java培训、期待与您交流! ----------

黑马程序员【】——java学习之路 877

黑马程序员_反射学习小结

1、Class的实例对象对应各个java类在内存中的字节码。 一个类被类加载器加载到内存中,占用一片空间,这个空间里面的内容就是类的字节码, 不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个空间可分别用 一个个的对象来表示,这些对象具有相同的类型,这个类型就是Class java反射:       1) 反射是Java自我管理(类, 对象)的机制  

yangqing_tt的专栏 367

黑马程序员_反射

---------------------- android培训、java培训、期待与您交流! -------------------- 一、什么是反射 反射就是把Java类中的各种成分映射成相应的java类。 Java可以加载一个运行时才得知名称的class,获得其完

294

黑马程序员————反射小结(第六篇)

一、反射的基石——Class类 二、反

让风继续吹 487

[黑马程序员SpringBoot2]——开发实用篇1

通用配置无法设置具体的数据源配置信息,仅提供基本的连接相关配置,如需配置,在下一级配置中设置具体设定。SpringBoot可以根据url地址自动识别数据库种类,在保障驱动类存在的情况下,可以省略配置。测试用例数据通常采用随机值进行测试,使用SpringBoot提供的随机数为其赋值。为测试用例添加事务,SpringBoot会对测试用例对应的事务提交操作进行回滚。SpringBoot提供了3种内嵌数据库供开发者选择,提高开发测试效率。优势:比多环境开发中的测试环境影响范围更小,仅对当前测试类有效。

qq_56444564的博客 480

黑马程序员_学习记录21:高新技术之反射小结

------- android培训、java培训、期待与您交流! ---------- 反射就是把Java类中的各种成分映射成相应的Java类! “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。 Java不是动态语言,却有着一个非常突出的动态相关机制:Reflection。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一

zy_bgd的专栏 363

JVM笔记(黑马+尚硅谷+张龙整合笔记)

JVM笔记(黑马+尚硅谷+张龙整合笔记) hancoder2020-03-30 22:11:432254收藏33 分类专栏:JavaJVM文章标签:JVM笔记黑马尚硅谷张龙 版权 前要 本身整合了如下视频的笔记,并进行了整理:尚硅谷周阳、张龙、黑马程序员 黑马ppt非常好:https://download.youkuaiyun.com/download/hancoder/12834607 本文及JVM系列笔记地址:https://blog.youkuaiyun.com/hancod...

wangzhipeng47的博客 987

反射相关知识点小结

黑马程序员   反射相关知识点小结 ------- android培训、java培训、期待与您交流!---------- (一)知识框架 1:反射(理解)     (1)类的加载及类加载器     (2)反射:         通过字节码文件对象,去使用成员变量,构造方法,成员方法     (3)反射的使用         A:通过反射获取构造方法并使用

zhuimengtianya33的博客 419

JAVA基础二刷

让该对象的类实现Comparable(比较规则)接口,重写compareTo方法,自定义比较规则// 指定比较规则 // this @Override public int compareTo(Student o) {// 约定1: 认为左边对象 大于 右边对象请您返回正整数 // 约定2: 认为左边对象 小于 右边对象请您返回负整数 // 约定3: 认为左边对象 等于 右边对象 请您一定返回0 //if(this.age > o.age){return 1;

qwerasdctds的博客 355

瑞_JVM虚拟机_类的生命周期

本文章为瑞_系列专栏之《JVM虚拟机》的类的生命周期篇,本篇章主要介绍类的加载阶段、连接阶段、初始化阶段、使用阶段以及卸载阶段。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 1807
上一篇: 黑马程序员--交通灯管理系统
laester
博客等级 码龄19年 36粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值