Java 能否自定义一个类叫 java.lang.ArrayList

Vscode+ROS/ROS2 开发调试基于ROS/ROS2应用环境配置 在ROS操作系统开发应用程序时,我们常常需要调试代码,验证程序的正确性。但是在用rosrun或者roslaunch启动节点后,若程序运行过程中发生错误而导致发生出错停止工作,这时候终端并不会输出具体的信息指出在何处发生了错误,具体错误的原因又是什么。往往仅仅是core dump 或者segmentation fault 等等一类的模糊提示。 阅读详情

关于这个问题,网上众说纷纭,类似的问题还有:java.lang.System,java.lang.String,java.lang.Math是否自己写一个jdk同名的类。

大概的答案主要分成以下2派:

  1. 可以,自定义classloader破坏双亲委派机制(由于系统自带的3个类加载器都加载特定目录下的类,如果我们自己的类加载器放在1个特殊的目录,那末系统的加载器就没法加载,也就是终究还是由我们自己的加载器加载。)
    点评:这个明显是没有实践过的一派人的发言,实践一下就会发现自定义classloader是行不通的。

  2. 不可以,即使自定义classloader,重写loadClass或者findClass方法,这样可以加载到自己指定目录下的class文件,但是由于自定义的classloader必须继承 ClassLoader,loadClass 方法会调用父类的 defineClass 方法。
    而父类的这个 defineClass 是一个 final 方法,无法被重写。



    protected final Class<?> defineClass(String name, byte[] b, int off, int len,
                                         ProtectionDomain protectionDomain)
        throws ClassFormatError
    {
        protectionDomain = preDefineClass(name, protectionDomain);
        String source = defineClassSourceLocation(protectionDomain);
        Class<?> c = defineClass1(name, b, off, len, protectionDomain, source);
        postDefineClass(c, protectionDomain);
        return c;
    }
    
    private ProtectionDomain preDefineClass(String name, ProtectionDomain pd)
    {
        if (!checkName(name))
            throw new NoClassDefFoundError("IllegalName: " + name);

        // Note:  Checking logic in java.lang.invoke.MemberName.checkForTypeAlias
        // relies on the fact that spoofing is impossible if a class has a name
        // of the form "java.*"
        if ((name != null) && name.startsWith("java.")) {
            throw new SecurityException
                ("Prohibited package name: " +
                 name.substring(0, name.lastIndexOf('.')));
        }
        if (pd == null) {
            pd = defaultDomain;
        }

        if (name != null) checkCerts(name, pd.getCodeSource());

        return pd;
    }

解密

可以自己写一个java.lang.System,java.lang.String,java.lang.Math,也能够得到编译,然而常规的方式会发现自己写的这个类没有机会被加载到JVM。
JVM中类加载采用的是双亲委派机制,BootStrapClassLoader是顶层父类,ExtClassLoader是BootStrapClassLoader类的子类,AppClassLoader又是ExtClassLoader的子类。

这里以java.lang.String为例,当我是使用到这个类时,Java虚拟机会将java.lang.String类的字节码加载到内存中。
这个时候jdk中自带一个java.lang.String,然而我们自己又写了一个java.lang.String,JVM会加载哪一个呢?

  • 因加载某个类时,优先使用父类加载器加载需要使用的类。如果我们自定义了java.lang.String这个类,
  • 加载该自定义的String类,该自定义String类使用的加载器是AppClassLoader,根据优先使用父类加载器原理,
  • AppClassLoader加载器的父类为ExtClassLoader,所以这时加载String使用的类加载器是ExtClassLoader,但是类加载器ExtClassLoader在jre/lib/ext目录下没有找到String.class类。然后使用ExtClassLoader父类的加载器BootStrapClassLoader,
  • 父类加载器BootStrap在JRE/lib目录的rt.jar找到了String.class,将其加载到内存中。这就是类加载器的委托机制。

参考文章
https://www.cnblogs.com/guweiwei/p/6641785.html
https://www.cnblogs.com/alexlo/p/5664543.html

终极结论

上面,只说对了一半(“可以自己写一个java.lang.System,java.lang.String,java.lang.Math,也能够得到编译,然而常规的方式会发现自己写的这个类没有机会被加载到JVM。”)
虽然jdk classloader与自定义classloader搞不定,但是不表示没有其它办法。
既然bootstrapclassloader可以加载java.lang.ArrayList ,那么bootstrapclasscloader扫描的包路径是如何指定的呢

解决方案
Java 命令行提供了如何扩展bootStrap 级别class的简单方法.

  • -Xbootclasspath: 完全取代基本核心的Java class 搜索路径. 不常用,否则要重新写所有Java 核心class
  • -Xbootclasspath/a: 后缀在核心class搜索路径后面.常用!!
  • -Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免引起不必要的冲突.

先来创建一个java.lang.JavaAlioo的java文件,编译并打包成jar javademo-javapackage-1.0.0-SNAPSHOT.jar

% more java/lang/JavaAlioo.java 
package java.lang;

public class JavaAlioo {
    static {
        System.out.println("JavaAlioo加载成功了,哈哈哈哈");
    }

    public void sayhi() {
        System.out.println("HELLO WORLD");
    }

    public static void main(String[] args) {
        new JavaAlioo().sayhi();
    }
}

其次编写测试用例JavaTest.java


% more JavaTest.java 
package com.alioo;

public class JavaTest {

    public static void main(String[] args) throws Exception {

        Class a = Class.forName("java.lang.JavaAlioo");

    }
}

常规运行会报如下错误:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
	at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at com.alioo.JavaTest.main(JavaTest.java:7)

将javademo-javapackage-1.0.0-SNAPSHOT.jar指定到bootstrappath中再运行一把发现就可以了

启动命令中增加如下参数:
-Xbootclasspath/p:/Users/mac/work/gitstudy/javademo/javademo-javapackage/target/javademo-javapackage-1.0.0-SNAPSHOT.jar

说明这里使用-Xbootclasspath/p 与 -Xbootclasspath/a都是可以的


JavaAlioo加载成功了,哈哈哈哈

进一步验证下jdk中的已经有的类java.lang.ArrayList来看看效果

package java.lang;

public class ArrayList {
    static {
        System.out.println("ArrayList加载成功了,哈哈哈哈");
    }

    public void sayhi() {
        System.out.println("ArrayListArrayListArrayListArrayList");
    }

}

启动命令中增加如下参数:
-Xbootclasspath/p:/Users/mac/work/gitstudy/javademo/javademo-javapackage/target/javademo-javapackage-1.0.0-SNAPSHOT.jar

说明这里只能使用-Xbootclasspath/p , 如果使用-Xbootclasspath/a 那么加载的就是jdk自带的java.lang.ArrayList了。

测试结果

ArrayList加载成功了,哈哈哈哈

至此,我们已经成功搞定了自己写的java.lang.JavaAlioo,java.lang.ArrayList的运行效果了,惊不惊喜,意不意外。
再提供另外一种方式也可以搞定,思路也是通过增加bootclasspath,api如下:

instrumentation.appendToBootstrapClassLoaderSearch(new JarFile(spyJarFile));

开源的arthas中用的就是这种方式,有兴趣的可以读读。

参考文章
https://www.cnblogs.com/duanxz/p/3482311.html

Apache-Plc4x-Modbus-Tcp学习记录(一) 阅读详情

相关推荐

逆向淘宝x-mini-wua:从加密算法到设备指纹的生成逻辑

本文深入剖析了淘宝风控核心参数x-mini-wua的生成逻辑与加密算法。通过逆向分析,揭示了其作为设备“身份证”的作用,详细拆解了从硬件信息采集、SG_INNER_DATA文件解密、关键参数提取到最终长wua合成的完整技术链条,并探讨了模拟生成与绕过风控的实战思路及注意事项。

year5的博客 1076

Java集合框架之:ArrayList的常见方法使用

Java本文主要介绍Java ArrayList的使用方法教程及示例代码

sjs52406的博客 3590

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 419

java的arraylist_java之ArrayList详细介绍

1 ArrayList介绍ArrayList简介ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。ArrayList继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添...

weixin_30700123的博客 732

成本150元的高性能RDP协议瘦客户机

云终端市场是一个跨度很大的市场。既有数千元的品牌的瘦客户机,也有几百元的瘦客户机,还有200-300元的支持RDP协议的多用户云终端。但是200-300元的多用户终端,在显示性能上不尽人意,一般用于地产中介门店,工厂产线的电子看板等场合。有没有性能更好,价格更低的方案呢? 答案是有。 这个方案就是 二手的x86 瘦客户机 + DoraOS瘦客户机系统免费版(仅支持RDP)。 首先我们看硬件,在某宝搜索 升腾C92 ,找到最低配置的( CPU:J1800,内存:2G,硬盘:8G)。价格都在150以内。

云飞扬的桌面云 7411

GEE案例:Landsat 5、7、8影像构建1985-2023年rsei生态遥感指数详细代码

rsei(Regional Silviculture Ecological Index,地区林业生态指数)是一种生态遥感指标,用于评估森林生态系统的健康状况和生态服务。构建1985-2023年的rsei生态遥感指,主要需要使用Landsat 5、7和8的遥感影像数据。以下是一种可能的构建方法:1. 数据获取:从美国地质调查局(USGS)或其他可靠数据提供商处获取Landsat 5、7和8的遥感影像数据。确保选择的影像具有适当的空间和时间分辨率,以覆盖所需的时间段。

此星光明博客 3412

Java ArrayList用法总结

com.google.common.collect 通过Lists的静态方法创建ArrayList,该类还可以创建其他的list,如LinkedList、CopyOnWriteArrayList等 List<T> result = Lists.newArrayList(); 进入到ArrayList.java,作者的注释如下: /** * Resizable-array implementation of the <tt>List</tt> interface. I

Willow的博客 883

路径规划 | 详解混合A*算法Hybrid A*(附ROS C++/Python/Matlab仿真)

Hybrid A*算法通过结合连续状态空间搜索、运动约束考虑和轨迹优化等技术,弥补了普通A*算法在高维连续空间和的不足,提高了路径规划的效率和鲁棒性,广泛应用于车规级路径规划。本文详细图解Hybrid A*算法的原理——启发式、维诺耗散项、节点扩展法则等,并给出ROS C++、python、matlab三种语言的仿真实现加深理解

FRIGIDWINTER的博客 1万+

Java集合类之List学习笔记

Java集合框架 文章目录Java集合框架1.集合框架1.1 概述1.2 框架体系1.2.1 体系总览1.2.2 框架总结2.Collection接口2.1 概述2.2 常用方法3.List集合3.1 概述3.2 常用方法3.3 ArrayList类4.3.1 概述4.3.2 构造方法4.3.3 成员方法3.4 LinkedList类4.4.1 概述4.4.2 构造方法4.4.3 成员方法3.5 ArrayList和LinkedList区别 1.集合框架 1.1 概述 引入:为了保存数量不确定的数据,以及

yalenlang_long的博客 1003

成功解决AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

​ 成功解决AttributeError: 'ImageDraw' object has no attribute 'textsize' 目录 解决问题 解决思路 解决方法 解决问题 AttributeError: 'ImageDraw' object has no attribute 'textsize' 解决思路 属性错误:'ImageDraw'对象没有属性'textsize' 解决方法 最新的Pillow 10.0.0 版本已经删除了这个函数,导致两个库(Pillow 、wordc

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4780

【DRAM存储器六十五】DDR5介绍--训练相关之MPC、Read Training Pattern、Read Preamble Training Mode

简述DDR5 MPC操作和读训练时颗粒输出pattern的配置

highman110的博客 362

Cannot construct instance of `java.util.ArrayList` (although at least one Creator exists): no String

although at least one Creator exists

m0_37731701的博客 9403

【DRAM存储器一】基本存储单元、阵列结构、读写原理

详述DRAM存储器存储单元、存储阵列结构和读写原理

highman110的博客 7256

复习Java.Lang包&Java面试题Vector、ArrayList、LinkedList区别&生活【记录一个咸鱼大学生三个月的奋进生活】007

记录一个咸鱼大学生三个月的奋进生活007复习Java(Lang包)数据包装类字符型Character常用方法字符串类(String) 复习Java(Lang包) Java常用的包: java.lang:包含java 最基础的类,可以直接在程序中使用这些类不需要再引入包。 java.io:包含支持输入/输出操作的类。 javax.swing:提供支持Java图形化组件的类。 java.util:包含一系列标准操作以管理数据集、访问日期以及分析字符串的类。 java.sql:包含支持使用标准sql的数据库访问功

coiokok的博客 3292

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java异常 java.lang.UnsupportedOperationException

Java异常 java.lang.UnsupportedOperationException java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at java.util.AbstractList$Itr.remove(AbstractList.java:...

技术小鬼的博客 1485

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java:核心包java.lang与java.util(必会知识点整理)

Java核心包(java.lang与java.util)及常用类详解

2301_80332713的博客 2075

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.Str

翻译过来就是 原因:java.lang.IllegalArgumentException:无效比较:java.util.ArrayList和java.lang.String 这个情况在list集合查找数据的sql中出的问题,在接受list的时候加了判断 list!=’’ ,引起了集合与String类型的比较 <choose> <when test="names!= ...

Charles 1666

java.lang包有哪些类_Java中Lang包的工具类有哪些

Java中Lang包的工具类有哪些发布时间:2020-12-08 16:15:36来源:亿速云阅读:76作者:Leah今天就跟大家聊聊有关Java中Lang包的工具类有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Lang 中工具类比较多,这里介绍几个主要的:ClassUtils: getShortClassName,这个函数应该在 ...

weixin_29586681的博客 1169

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map

1、错误描述java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map at service.impl.BillServiceImpl.exportBillExcel(BillServiceImpl.java:336) at sun.reflect.NativeMethodAccessorI

游海东的技术专栏 3万+

java .ArrayList类

对于ArrayList来说,有一个尖括号代表泛型。 泛型也就是装在集合中当中的所有的元素,全部是统一的什么类型。 注意,泛型只能是引用类型,不能是基本类型 下面通过代码来说明ArrayList中的操作: package edu.shengda; import java.util.ArrayList; public class demoArrayList { public static void...

张志郑的博客 166

Java 中 ArrayList类的用法(转)

                                     Java 中 ArrayList类的用法 1、什么是ArrayList       ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和IList接口 灵活的设置数组的大小 2、如何使用ArrayList      

fskjb01的专栏 1856

Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.Str...

翻译过来就是 原因:java.lang.IllegalArgumentException:无效比较:java.util.ArrayList和java.lang.String 这个情况在list集合查找数据的sql中出的问题,在接受list的时候加了判断 list!='' ,引起了集合与String类型的比较 <choose> <when test...

weixin_30836759的博客 702

java—ArrayList类

/* ArrayList是泛型,不能是基本类型 如果希望向集合ArrayList当中存储基本类型数据,必须使用基本类型对应的“包装类”。 基本类型 包装类(引用类型,包装类都位于java.lang包下) byte Byte short Short int Integer 【特殊】 long Long float Float double Double char Character 【特殊】 bo.

a157215961的博客 371

java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList

java.lang.ClassCastException java.util.AbstractList$SubAbstractListRandomAccess cannot be cast to java.util.ArrayList 1 com.yunshuxie.main.SubmitJobActivity.setImgListDate(SubmitJobActivity.java:418...

songwenhui100的博客 1万+

ArrayList Iterator remove java.lang.UnsupportedOperationException

在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add

liuzhigang1237的专栏 6152

java.lang包中有哪些类,java,util包中有哪些类,Scanner类有哪些方法?

这只是Scanner类的一些常用方法,还有其他方法可以在Java API文档中查找到。: 检查下一个输入项是否为双精度浮点数。: 检查下一个输入项是否为整数。: 检查是否还有下一个输入项。: 读取下一个双精度浮点数。: 关闭Scanner对象。: 读取下一个字符串。: 读取下一行字符串。

2301_76604664的博客 454
上一篇: sed替换、提取内容案例
下一篇: 为什么有CompletableFuture
明月(Alioo)
博客等级 码龄18年 267粉丝 207原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月(Alioo)

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值