首页 > 编程知识 正文

java底层原理怎么学,java底层原理面试题

时间:2023-05-05 11:24:18 阅读:17459 作者:1788

前言

必须实现在工作中动态加载类对象信息的功能。 简单来说,class变成了Jvm,很快就可以知道并加载到内存中了。

类加载器分类

Ava类加载器有两种类型:启动类和其他类加载器。 Java加载类关系: Launcher

1 .启动类加载器(bootstrap类加载器)。

因为Java程序在Jvm上运行,所以Jvm需要知道Java程序的入口在哪里(启动类)。 Jvm通过c的加载主类加载Java程序的sun.launcher.LauncherHelper。 加载包含Mian函数的扩展类加载器和app类加载器。

2. Java自己创建的类加载器。

2.1 ext类加载器扩展类加载器

ExtClassLoader类没有父类。

stringvar0=system.getproperty (Java.ext.dirs );

上面的代码允许您设置类扩展类装载器装载Jar包的目录。

2.2在app class loader class _ path中指定的Jar包

app类加载器的父类是ext类加载器。 我们的主函数所在类的类加载器是app类加载器。

Java类加载器加载的Jar包路径

importsun.misc.Launcher; importjava.net.URL; publicclassclassloaderdemo1{ publicstaticvoidmain (string [ ] args ) }

string [ ] split=system.getproperty (' sun.boot.class.path ' ).split )、';' ); for(intI=0; i split.length; I ) {

system.out.println(split[I];

}

system.out.println ((=========================) );

URL [ ] URLs=launcher.getbootstrapclasspath ().getURLs ); for(intI=0; i urLs.length; I ) {

system.out.println(URLS[I];

}

}

}

执行结果:

委托机制

基于类加载器绘制Java委托和加载的原理图。

不会重新加载Java是由类的完全限定名称确定的

Java委托机制的好处。

1 .确保核心包加载不受干扰。

确保class加载是唯一的。

SPI机制

请先看看案例

publicinterfaceserverspi { voidexecmethod (;

}

两个实现类

publicclassserverspiimpl 1实施器sserverspi {

@Overridepublic voidexecMethod ()

system.out.println (serverspiimpl1. exec method执行);

}

}

publicclassserverspiimpl2implementsserverspi

@Overridepublic voidexecMethod ()

system.out.println (serverspiimpl2. exec method执行);

}

}

配置(目录匹配,文件名为接口名称) ) ) ) )。

文件的内容(类的完全限定名称) )。

写测试班

importsun.misc.Service; importjava.util.Iterator; publicclasspitest { publicstaticvoidmain { string [ ] args }

迭代器提供程序=service.providers (servers pi.class ); while(providers.Hasnext () ) )

ServerSPI ser=providers.next (;

ser.execMethod (;

}

}

}

执行结果:

serviceloaderload=service loader.load (SPI service.class ) -也可以使用此方法检索加载的对象。

在此情况下,没有使用Java委托机制来实现类的加载功能。

服务源代码重点:

私有身份验证前缀=' meta-INF/services/'; -为什么指定了目录?

publicstaticiteratorproviders (classvar0) throwsserviceconfigurationerror {

class loader var1=thread.current thread ().getContextClassLoader ); -获取线程所在的类类加载器。 返回提供程序(var1,var1);

}

SPI负载类原理:

1 .必须指定目录,程序必须在已知目录下找到接口信息,并根据接口找到实现类。

2 .用线程所在的ClassLoader加载实现,用反射实例化对象。

3 .其他精细源代码,有兴趣自己理解。

4 .我们常用的JDBC是使用SPI机制实现类加载。

自定义类加载器

实现热部署功能的情况: https://www.cn blogs.com/jssj/p/13251804.html

在案例中很好地利用了自定义类加载器,实现了如何打破Java委托机制。

总结

类加载器类型、类加载器各自的分工、类加载器委托流程、SPI机制和自定义加载器的实现。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。