luaj 加载自定义java_自己实现Classloader加载自定义java.lang.Math类

本文通过实例代码讲解如何创建自定义ClassLoader加载类,但遇到`java.lang`包名时会抛出SecurityException,原因是Java的安全机制禁止加载此类。详细分析了加载流程并指出自定义ClassLoader无法加载以`java.`开头的类。
摘要由CSDN通过智能技术生成

自定义加载器实现

public class MyClassLoader extends ClassLoader {

@Override

public Class> loadClass(String name) throws ClassNotFoundException {

try{

String className = null;

if(name.startsWith("java.lang")){

className = "/" + name.replace('.', '/') + ".class";

}else{

className = name.substring(name.lastIndexOf('.') + 1) + ".class";

}

InputStream is = getClass().getResourceAsStream(className);

if (is == null) {

return super.loadClass(name);

}

byte[] b = new byte[is.available()];

is.read(b);

return defineClass(name, b, 0, b.length);

}catch (Exception e) {

e.printStackTrace();

throw new ClassNotFoundException();

}

}

}

Main方法

public class ClassLoaderTest {

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

ClassLoader myLoader = new MyClassLoader();

Object obj = myLoader.loadClass("java.lang.MyMath").newInstance();

System.out.println(obj);

}

}

Math方法

package java.lang;

public final class Math {

public static void main(String[] args) {

System.out.println("hello world");

}

}

结果

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.lang.ClassLoader.defineClass(ClassLoader.java:642)

at com.vivo.demo.classload.MyClassLoader.loadClass(MyClassLoader.java:37)

at com.vivo.demo.classload.ClassLoaderTest.main(ClassLoaderTest.java:14)

Exception in thread "main" java.lang.ClassNotFoundException

at com.vivo.demo.classload.MyClassLoader.loadClass(MyClassLoader.java:41)

at com.vivo.demo.classload.ClassLoaderTest.main(ClassLoaderTest.java:14)

classLoader里面有一个preDefineClass会判断加载的路径是以java.lang开头的会报错

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;

}

我们梳理一下过程,如果用自定义的类加载器加载我们自定义的类

1.会调用自定义类加载器的loadClass方法

2.而我们自定义的classLoader必须继承ClassLoader,loadClass方法会调用父类的defineClass方法

3.而父类的这个defineClass是一个final方法,无法被重写

4.所以自定义的classLoader是无论如何也不可能加载到以java.开头的类的

【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值