题主是一名C/C++程序员,刚开始学习java。疑惑如下:java没有头文件,当调用第三方包(无源码)的方法,编译器如何保证程序员使用了正确的原型呢?定义包时,为了保证包名唯一,使用package a.b.c语法,包的类需要在文件系统的a/b/c目录下。但当其他java程序使用该包时,这个路径信息怎么在运行查找这个包时体现?某c程序编译时依赖库liba.so,那么运行时系统必须提供库liba.so,但是java程序编译时使用abc.jar,但是运行时可以提供bcd.jar,只要bcd.jar里具有该java程序用到的类就行?(我自己瞎猜的,请问这个说法对不对?)最后,java有没有类似于《链接、装载与库》这样的书籍,或者请大家推荐一些可以了解原理的书籍,能够解答这些困惑,中英文皆可。感谢。非常感谢大家的解答,试着将各位的回答总结整理如下:jar包里的class文件中含有文件原型。c/c++的libxxx.so/libxx.a中只有符号,没有原型,原型由头文件中提供;java的class文件中即含有原型信息。编译器只要解析class文件即可知道程序员是否使用了正确的原型。(@fredric_201 与 @心不在焉 )jar包即zip包,里面存在目录结构,该结构与包名结构完全一致(标准jar包,非android jar包)。(@心不在焉 与 @beanlam)说法正确。java程序依赖的实际是class,jar包只是一组class的zip包,其命名无关紧要,因此可以任意修改。如果非要和c/C++进行对比,libxx.so类似于.class,而非jar包。(@心不在焉 与 @beanlam)笔者在ubuntu机器上使用zipinfo查看openjdk自带的jar包,如下:prife@droi: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib$ zipinfo rt.jar...-rw---- 2.0 fat 24298 bl defN 15-Jul-24 08:17 java/lang/String.class-rw---- 2.0 fat 1734 bl defN 15-Jul-24 08:17 java/lang/Object.class可以看到rt.jar包里具有跟包名完全一致的目录结构。最后感谢大家推荐的书籍:《深入理解java虚拟机》《Java Virtual Machine Specification》PS. 笔者之所以对第二点看到困惑,因为作为Android程序员,发现安卓的jar包里是只有dex文件,没有包名的目录结构。再次感谢大家的解答。
5 回答
千万里不及你
TA贡献1784条经验 获得超9个赞
1,Java的bytecode里面有方法的原型信息,编译时有class文件即可
2,Java运行时从classpath里面寻找jar文件,再在jar文件里面找包名对应的a/b/c.class
3,是这样的
手掌心
TA贡献1942条经验 获得超3个赞
看一本关于讲解jvm的书,具体的细节,看看类加载,《深入jvm虚拟机》。
1、:全类名定义一个类,每个类被加载一次。
2、:你是想问怎么找到吧,我觉得和全类名比较类似。
最后个我没懂你的意思
大话西游666
TA贡献1817条经验 获得超14个赞
我个人是这样理解的:
1、c/c++编译出的库和java生成jar包这两件事情是不等价的,jar包本质上只是一个压缩包;如果一定要类比,c/c++编译的过程应该相当于java生成class文件的过程,也就是代码转换成机器(或虚拟机)可以理解并执行的文件;
2、JAVA虚拟机会把目标class文件加载到内存里,其中类的信息应该放到“方法区”,被实例化的时候,引用在栈、实例在堆(和c/c++的malloc或new类似)。
3、每一个类是通过 类加载器 + 包名 + 类名 三部分信息在JVM中唯一标识;
4、比较好的书有《深入理解java虚拟机》、《osgi原理与最佳实践》;
慕沐林林
TA贡献2016条经验 获得超9个赞
添加回答
举报
0/150
提交
取消
