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
:-),多谢二位了
Global site tag (gtag.js) - Google Analytics