2024年要探索JDK的核心底层源码,那必须掌握native用法,2024Java开发社招面试总结

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。

native的源码怎么看呢

=================================================================================

以**private static native String getSystemTimeZoneID(String javaHome)**为例

getSystemTimeZoneID方法所在的package java.util.TimeZone;

如图所示,找到TimeZone.c下的getSystemTimeZoneID方法

image-20210706233905997

image-20210706234052425

/*

  • Gets the platform defined TimeZone ID

*/

JNIEXPORT jstring JNICALL

Java_java_util_TimeZone_getSystemTimeZoneID(JNIEnv *env, jclass ign,

jstring java_home, jstring country)

{

const char *cname;

const char *java_home_dir;

char *javaTZ;

if (java_home == NULL)

return NULL;

java_home_dir = JNU_GetStringPlatformChars(env, java_home, 0);

if (java_home_dir == NULL)

return NULL;

if (country != NULL) {

cname = JNU_GetStringPlatformChars(env, country, 0);

/* ignore error cases for cname */

} else {

cname = NULL;

}

/*

  • Invoke platform dependent mapping function

*/

javaTZ = findJavaTZ_md(java_home_dir, cname);

free((void *)java_home_dir);

if (cname != NULL) {

free((void *)cname);

}

if (javaTZ != NULL) {

jstring jstrJavaTZ = JNU_NewStringPlatform(env, javaTZ);

free((void *)javaTZ);

return jstrJavaTZ;

}

return NULL;

}

重点:调用不同平台相关的映射函数

/*

  • Invoke platform dependent mapping function

*/

javaTZ = findJavaTZ_md(java_home_dir, cname);

去查找findJavaTZ_md方法时,发现存在分别在solaris和windows两个目录下。

image-20210706234905448

查了下这两个目录的差别:

因为OpenJDK里,Java标准库和部分工具的源码repo(jdk目录)里,BSD和Linux的平台相关源码都是在solaris目录里的。

原本Sun JDK的源码里平台相关的目录就是从solaris和windows这两个目录开始的,后来Unix系的平台相关代码全都放在solaris目录下了,共用大部分代码。

作者:RednaxelaFX

链接:https://www.zhihu.com/question/58982441/answer/170264788

来源:知乎

简单的理解就是:

window系统下,使用windows目录下编译的JDK代码

unix系的平台下,使用solaris目录下编译的JDK代码

了解不同系统下findJavaTZ_md方法执行

=============================================================================================

windows系统


/*

  • Detects the platform time zone which maps to a Java time zone ID.

*/

char *findJavaTZ_md(const char *java_home_dir, const char *country)

{

char winZoneName[MAX_ZONE_CHAR];

char winMapID[MAX_MAPID_LENGTH];

char *std_timezone = NULL;

int result;

winMapID[0] = 0;

result = getWinTimeZone(winZoneName, winMapID);

if (result != VALUE_UNKNOWN) {

if (result == VALUE_GMTOFFSET) {

std_timezone = _strdup(winZoneName);

} else {

std_timezone = matchJavaTZ(java_home_dir, result,

winZoneName, winMapID, country);

}

}

return std_timezone;

}

注释写得很清楚,获取“Time Zones”注册表中的当前时区

/*

  • Gets the current time zone entry in the “Time Zones” registry.

*/

static int getWinTimeZone(char *winZoneName, char *winMapID)

{

}

时区的设置方式:

image-202107086550950

那时区上的选择值是从哪取到的,上面有说了,是在注册表中取值

打开注册表 :Regedit–>

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\

unix系的平台


findJavaTz_md()方法的注释上写得很清楚了:将平台时区ID映射为Java时区ID

/*

  • findJavaTZ_md() maps platform time zone ID to Java time zone ID

  • using <java_home>/lib/tzmappings. If the TZ value is not found, it

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

外链图片转存中…(img-TWOhi9X8-1715269102969)]

[外链图片转存中…(img-sjphi5pW-1715269102969)]

[外链图片转存中…(img-bPTyTZsb-1715269102970)]

[外链图片转存中…(img-2I5FlRbD-1715269102970)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值