java 自定义的类加载器_Java如何自定义类加载器[通俗易懂]

java 自定义的类加载器_Java如何自定义类加载器[通俗易懂]我们可以编写自己的用于特殊目的的类加载器,这使得我们可以在向虚拟机传递字节码之前执行定制的检查。如何自定义类加载器如果想要编写自己的类加载器,只需要两步:继承ClassLoader类覆盖findClass(StringclassName)方法ClassLoader超类的loadClass方法用于将类的加载操作委托给其父类加载器去进行,只有当该类尚未加载并且父类加载器也无法加载该类时,才调用fin…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我们可以编写自己的用于特殊目的的类加载器,这使得我们可以在向虚拟机传递字节码之前执行定制的检查。

如何自定义类加载器

如果想要编写自己的类加载器,只需要两步:

继承ClassLoader类

覆盖findClass(String className)方法

ClassLoader超类的loadClass方法用于将类的加载操作委托给其父类加载器去进行,只有当该类尚未加载并且父类加载器也无法加载该类时,才调用findClass方法。

如果要实现该方法,必须做到以下几点:

1.为来自本地文件系统或者其他来源的类加载其字节码。

2.调用ClassLoader超类的defineClass方法,向虚拟机提供字节码。

下面是自定义类加载器的一种实现方式:

public class CustomClassLoader extends ClassLoader {

protected Class> findClass(String name) throws ClassNotFoundException {

try {

String cname = “/Users/wuzhenyu/Desktop/spring-boot/src/main/java/” + name.replace(‘.’, ‘/’) + “.class”;

byte[] classBytes = Files.readAllBytes(Paths.get(cname));

Class> cl = defineClass(name, classBytes, 0, classBytes.length);

if (cl == null) {

throw new ClassNotFoundException(name);

}

return cl;

} catch (IOException e) {

System.out.print(e);

throw new ClassNotFoundException(name);

}

}

}

我在该类的目录下准备了一个编译好的类文件SayHello.class(后缀改为了text),SayHello.class对应的Java代码如下:

public class SayHello {

public static void main(String[] args) {

System.out.print(“Hello World”);

}

}

下面是测试类的代码:

测试前请删除SayHello.java文件

public class ClassLoaderTest {

public static void main(String[] args) {

try {

ClassLoader loader = new CustomClassLoader();

//调用loadClass加载sample.loader.SayHello类

//无法加载到该类,因此会调用findClass方法

Class> c = loader.loadClass(“sample.loader.SayHello”);

Method m = c.getMethod(“main”, String[].class);

m.invoke(null, (Object) new String[]{});

} catch (Throwable e) {

System.out.println(e);

}

}

}

运行结果如下:

Hello World

这是一个简单的实现自己类加载器的例子。在更复杂的案例中,使用的往往是加密过的类文件,加载该类字节码时,还需要解密。不然它们就不能由标准虚拟机来执行,也不能轻易被反汇编。

类加载器相关的API

1. java.lang.Class

ClassLoader getClassLoader(): 获取加载该类的类加载器

2.java.lang.ClassLoader

ClassLoader getParent():返回父类加载器,如果父类加载器是引导类加载器,则返回null。

static ClassLoader getSystemClassLoader():获取系统类加载器,即用于加载第一个应用类的类加载器。

protected Class findClass(String name):类加载器应该覆盖该方法,以查找类的字节码,并通过调用defineClass方法将字节码传给虚拟机。在类的名字中,使用.作为包名分隔符,并且不使用.class后缀。

Class definedClass(String name, byte[] byteCodeData, int offset, int length):将一个新的类添加到虚拟机,其字节码在给定的数据范围中。

3.java.net.URLClassLoader

URLClassLoader(URL[] urls)

URLClassLoader(URL[] urls, ClassLoader parent) :构建一个类加载器,它可以从给定的URL处加载类。如果URL以 / 结尾,那么它表示的一个目录,否则,它表示的是一个JAR文件。

4.java.lang.Thread

ClassLoader getContextClassLoader():获取类加载器,该线程的创建者将其指定为执行该线程时最适合使用的类加载器。

void setContextClassLoader(ClassLoader loader):为该线程中的代码设置一个类加载器,以获取要加载的类。如果在启动一个线程时没有显式地设置上下文类加载器,则使用父线程的上下文类加载器。

参考文献《Java 核心技术 卷二》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196723.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mybatis log 激活码【2021.7最新】「建议收藏」

    (mybatis log 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

  • java工程师项目经验_java初级工程师项目经验简历范文

    java工程师项目经验_java初级工程师项目经验简历范文项目经验(案例一)项目时间:2015-01-2015-06项目名称:DRGS审核系统|项目工具:win8项目描述:项目介绍涉及技术:jQuery+Ajax+JSON+Spring(MVC,IOC,AOP)+MyBatis+sqlserver+jqgrid+bootstrap+layer项目说明:针对医院drgs进行管理。院长使用系统可以在考察本医院各科室能力和综合实力在同属医院中的排名,从…

    2022年10月21日
  • mac 亿图11 激活码-激活码分享

    (mac 亿图11 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • iOS之深入解析Xcode 13正式版发布的40个新特性

    iOS之深入解析Xcode 13正式版发布的40个新特性一、前言Xcode13包括适用于iOS15、iPadOS15、tvOS15、watchOS8和macOSBigSur11.3的SDK。Xcode13ReleaseCandidate支持iOS9及更高版本、tvOS9及更高版本以及watchOS2及更高版本的设备上调试。Xcode13需要运行macOS11.3或更高版本的Mac。二、通用Xcode13包括对Swift并发编程的原生支持、对XcodeCloud持续集成和

  • 智慧小区智慧物业管理系统一体化解决方案怎么写_小区物业管理系统界面

    智慧小区智慧物业管理系统一体化解决方案怎么写_小区物业管理系统界面传统物业在管理上不仅成本高,服务质量也很难有所保障。现在很多小区都安装了智能物业管理系统,它将信息手段与现代物业管理工作相结合,帮助物业管理团队及时响应客户需求,降低运营成本,提升服务品质。智慧物业是指充分利用物联网、云计算、移动互联网等新一代信息技术的集成应用,将物业各个单位紧密连接起来,实现数据的融合,建立起高效的联动机制。为业主提供一个安全、便利的智慧化生活环境。会比传统物业,带来更舒适的体验感与满意度。随着物联网不断完善,智能技术几乎渗透到各行各业的众多领域。智能运用的迅速发展将颠覆我们的生

    2022年10月18日
  • How Powerful are Graph Neural Networks? GIN 图同构网络 ICLR 2019 论文详解

    文章目录1相关介绍Definition1:multiset数学上的单射(injective)2GNN怎么和Weisfeiler-Lehmantest关联起来?2.1符号定义2.2GraphNeuralNetworks2.3两类任务2.3Weisfeiler-Lehmantest图同构测试3WLtest是GNN性能的上限Lemma24什么样的GNN可以和W…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号