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 核心技术 卷二》

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html如何设置有序列表的列表项,HTML的有序列表

    html如何设置有序列表的列表项,HTML的有序列表针对HTML的有序列表,由于平常使用的不是很多,刚开始使用的时候也是有遇到一些坑,有几个小问题:1.li的宽度不能设置为100%,这样的话就没办法看到前面的序号2.如果设置li的颜色字体大小,前面的序号会跟着变化,但是给Li设置背景颜色,需要是不会有背景色的3.序号的所占空间约在两个字符之间,但是又不算在Li空间里面,所以在写css样式的时候可能要注意好有序列表有几种项目1项目2项目3第一个typ…

    2022年6月16日
    38
  • Android严苛模式StrictMode使用详解[通俗易懂]

    Android严苛模式StrictMode使用详解[通俗易懂]StrictMode类是Android 2.3(API9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线

    2022年7月3日
    24
  • LaTeX的下载安装及使用教程

    LaTeX的下载安装及使用教程1.关于 LaTeX和CTeXLaTeX是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利·兰伯特(LeslieLamport)在20世纪80年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档…

    2022年5月27日
    61
  • ov7725 stm32_如何给实验培养皿拍照

    ov7725 stm32_如何给实验培养皿拍照平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子)工程介绍:需要移植FatFs文件系统,同时需要了解BMP位图的存储数据结构,从而实现将摄像头输出的RGB565像素数据直接输出到sd卡上,保存为*.bmp文件。1.BMP位图的存储1.1 数据结构介绍//BMP头文…

    2022年9月24日
    3
  • 什么是备胎算法?_备胎怎么解释

    什么是备胎算法?_备胎怎么解释什么是备胎算法?

    2022年4月22日
    56
  • ModelSimSE_10.2c破解

    ModelSimSE_10.2c破解我开始也是找的网上破解crack,但是生成license后打开软件提示:modelsim打开时候出现提示:“unabletocheckoutaviewerlicensenecessaryforuseofthemodelsimgraphicaluserinterface.Vsimisclosing”。说明license还是有问题;按照破解说明,需要pat…

    2022年5月22日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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