javac编译问题
fzuwwl
2011-05-11
sun官方发布得javac可否编译生成字节码中super_class字段值为0得类呢?
|
|
IcyFenix
2011-05-11
在Java语言中,除了java.lang.Object,其他类都有父类,因此它们都应当生成有super_class。
|
|
fzuwwl
2011-05-11
IcyFenix 写道 在Java语言中,除了java.lang.Object,其他类都有父类,因此它们都应当生成有super_class。
这个我知道,而我问得其实也就是,它这个Object.class最终是如何编译产生得 |
|
RednaxelaFX
2011-05-11
fzuwwl 写道 IcyFenix 写道 在Java语言中,除了java.lang.Object,其他类都有父类,因此它们都应当生成有super_class。
这个我知道,而我问得其实也就是,它这个Object.class最终是如何编译产生得 这个嘛,特殊处理呗。javac会判断正在编译的类是不是java.lang.Object,是的话就生成没有super class的类。 MemberEnter.complete(Symbol) // Determine supertype. Type supertype = (tree.extending != null) ? attr.attribBase(tree.extending, baseEnv, true, false, true) : ((tree.mods.flags & Flags.ENUM) != 0 && !target.compilerBootstrap(c)) ? attr.attribBase(enumBase(tree.pos, c), baseEnv, true, false, false) : (c.fullname == names.java_lang_Object) ? Type.noType : syms.objectType; ct.supertype_field = supertype; |
|
fzuwwl
2011-05-11
RednaxelaFX 写道 fzuwwl 写道 IcyFenix 写道 在Java语言中,除了java.lang.Object,其他类都有父类,因此它们都应当生成有super_class。
这个我知道,而我问得其实也就是,它这个Object.class最终是如何编译产生得 这个嘛,特殊处理呗。javac会判断正在编译的类是不是java.lang.Object,是的话就生成没有super class的类。 MemberEnter.complete(Symbol) // Determine supertype. Type supertype = (tree.extending != null) ? attr.attribBase(tree.extending, baseEnv, true, false, true) : ((tree.mods.flags & Flags.ENUM) != 0 && !target.compilerBootstrap(c)) ? attr.attribBase(enumBase(tree.pos, c), baseEnv, true, false, false) : (c.fullname == names.java_lang_Object) ? Type.noType : syms.objectType; ct.supertype_field = supertype; 这段代码哪里的?我们可不可以自己生成一个木有超类得class? |
|
fzuwwl
2011-05-11
RednaxelaFX 写道 fzuwwl 写道 IcyFenix 写道 在Java语言中,除了java.lang.Object,其他类都有父类,因此它们都应当生成有super_class。
这个我知道,而我问得其实也就是,它这个Object.class最终是如何编译产生得 这个嘛,特殊处理呗。javac会判断正在编译的类是不是java.lang.Object,是的话就生成没有super class的类。 MemberEnter.complete(Symbol) // Determine supertype. Type supertype = (tree.extending != null) ? attr.attribBase(tree.extending, baseEnv, true, false, true) : ((tree.mods.flags & Flags.ENUM) != 0 && !target.compilerBootstrap(c)) ? attr.attribBase(enumBase(tree.pos, c), baseEnv, true, false, false) : (c.fullname == names.java_lang_Object) ? Type.noType : syms.objectType; ct.supertype_field = supertype; 难道只要是一个java.lang.Object类编译器识别出来后就把把它得超类设置为空? |
|
fzuwwl
2011-05-11
fzuwwl 写道 RednaxelaFX 写道 fzuwwl 写道 IcyFenix 写道 在Java语言中,除了java.lang.Object,其他类都有父类,因此它们都应当生成有super_class。
这个我知道,而我问得其实也就是,它这个Object.class最终是如何编译产生得 这个嘛,特殊处理呗。javac会判断正在编译的类是不是java.lang.Object,是的话就生成没有super class的类。 MemberEnter.complete(Symbol) // Determine supertype. Type supertype = (tree.extending != null) ? attr.attribBase(tree.extending, baseEnv, true, false, true) : ((tree.mods.flags & Flags.ENUM) != 0 && !target.compilerBootstrap(c)) ? attr.attribBase(enumBase(tree.pos, c), baseEnv, true, false, false) : (c.fullname == names.java_lang_Object) ? Type.noType : syms.objectType; ct.supertype_field = supertype; 难道只要是一个java.lang.Object类编译器识别出来后就把把它得超类设置为空? 我做了下测试,貌似真的是这样。 |
|
IcyFenix
2011-05-11
这段代码就是javac的源码,javac本身就是java写的,debug一下很方便。
(c.fullname == names.java_lang_Object) ? Type.noType : syms.objectType;要不,你改一下这里,加个or玩玩,或者直接修改/生成字节码也行。 |
|
RednaxelaFX
2011-05-11
fzuwwl 写道 这段代码哪里的?我们可不可以自己生成一个木有超类得class?
那就是javac的源码撒。如果你去下载JDK的源码包,它的位置在包里的 j2se/src/share/classes/com/sun/tools/javac 里。完整类名是 com.sun.tools.javac.comp.MemberEnter。 OpenJDK的话在langtool目录里。 |
|
fzuwwl
2011-05-11
:-),多谢二位了
|
相关讨论
相关资源推荐
- Linux 之父 LinusTorvalds 喊话:Rust 即将出现在 Linux 内核中
- 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)前言
- 锐龙 linux内核,Linux之父Linus Torvalds放弃了Intel,改为AMD 32核锐龙,编程速度快了3倍...
- Linux 4.0 正式发布 彻底告别计算机重启时代
- Linux 4.0 正式发布 完全离别计算机重启年代
- linuxcon_LinuxCon第3天回顾:Linus Torvalds,内核实习生和Internet存档
- 深入 git 必看:git 是如何被创造的?讲述 git 的诞生史、核心思想及其父:Linus Torvalds
- Linux centos7升级内核(两种方法:内核编译和yum更新)
- 《Linux4.0设备驱动开发详解》笔记--第二章:Linux内核及内核编程
- Linux内核将引入Rust,Linus:以防此事搞砸了我又发脾气,先给大家道个歉