当前位置: 首页 > 知识库问答 >
问题:

在java中,这样的类类型编译成什么?

干亮
2023-03-14

下面是定义类型的代码:

package annotationtype;

public class Example {

    public static void main(String[] args){


    }
}

通过javac将其功能编译为:

public class annotationtype.Example{
    public static Class<annotationtype.Example> class;
    {
        class = Class.forName("annotationtype.Example")
    }
    public annotationtype.Example(){}
    public static void main(java.lang.String[] args){}
}

我主要关注的是

我的理解正确吗?


共有2个答案

壤驷深
2023-03-14

如果“功能编译”是指“字段”在未明确声明的情况下对您可用,那么您是正确的。当然,class不是字段,而是java语言中的类文本。

此外,如果我们编译javac Example.java然后disasemblejavap-c示例,我们只剩下这个:

Compiled from "Example.java"
public class Example {
  public Example();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: return
}

请注意,在这个伪造的代码中没有对class的引用。另一方面,默认构造函数示例()确实神奇地出现了,公平地说

public class Example {
    public static void main(String[] args){
    }
}

编译

public class Example {
    public Example(){}
    public static void main(String[] args){
    }
}
颛孙品
2023-03-14

如JLS 15.8所述,类文字是语言规范的一部分。2.

类文字是由类、接口、数组或基元类型的名称或伪类型void后跟“.”组成的表达式和token类。

类的类型,其中C是类、接口或数组类型的名称(§4.3),是类

p.class的类型是class,其中p是基元类型的名称(§4.2)

void.class类型(§8.4.5)是类

javac不会为每个类创建一个静态class字段,但它会识别一个类文本表达式并正确编译它。

以类为例:

public class Hello {
        public static void main(String[] args){
                Class<?> myClass = Hello.class;
                System.out.println("Hello, " + myClass);
        }
}

这编译为(仅包括字节码的相关部分):

public class Hello   minor version: 0   major version: 52   flags:
 ACC_PUBLIC, ACC_SUPER 
Constant pool:    
#1 = Methodref          #11.#20        // java/lang/Object."<init>":()V    
#2 = Class              #21            // Hello
......
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=3, locals=2, args_size=1
     0: ldc           #2                  // class Hello
     2: astore_1

您可以看到javac在常量池中放置了对Hello类的引用,然后当我在main中引用它时加载了该常量。

 类似资料:
  • 问题内容: 下面是定义枚举类型的代码。 在内部进行编译, 我的理解正确吗? 问题答案: 从功能上讲,是的。从字面上看,不是(您不能为一件事明确地子类化)。有一个。而且您的代码无效(您无法调用),并且需要返回类型。

  • 我正在使用Java,我正在尝试调查和学习健康市场科学的sqlBuilder源代码。您可以通过添加此maven依赖项来获取源代码。 文件BaseCreateQuery。类具有以下代码 我想知道这个类型(在第1行)是什么意思。这与Java中的泛型有关吗。我研究了Java中的泛型,但没有找到对这种类型的引用。TypeScript具有ThisType构造。这类似于Java中的这种类型吗?

  • 问题内容: 我有以下代码: 实际上,它可以像人们期望的那样进行编译和工作。但是,如果将返回类型设为相同,则不会编译,因为预期的“名称冲突:method(Pair)和method(Pair)具有相同的擦除” 鉴于返回类型不是方法签名的一部分,这种重载怎么可能? 问题答案: 考虑以下4种方法 根据当前的Java语言规范, m1和m2无法共存,m3和m4也不能共存。因为它们具有相同的参数类型。 M1和M

  • 问题内容: 我在阅读新发布的Java 8 in Action,发现从第5章粘贴了一部分代码,但未编译: Eclipse表示:“类型不匹配:无法从转换为” 在与作者在Github上给出的内容进行比较之后,以下代码进行了编译: 唯一的变化是从“ j”到“(整数j)”。 但是,第一个版本不是与Java 8提供的语法糖完全等同于第二个版本吗?Java为什么拒绝编译它? 谢谢 顺便说一句: 问题答案: 首先

  • 我正在阅读新发布的Java 8在行动中,发现有一段从第5章粘贴的代码没有编译: Eclipse说:“类型不匹配:无法从< code >列表转换 在与作者在Github上给出的内容进行比较后,编译如下: 唯一的变化是从“j”到“(整数j)”。 但是,第一个版本与第二个版本在Java8提供的语法糖中不是完全相同吗?为什么Java拒绝编译它? 谢谢 顺便说一句:

  • 我试图从protobuf生成java类。 下面是我的协议- 我运行命令main/exec/protoc--java\u out=main/java main/proto/datamodel。协议 该协议是从链接https://github.com/protocolbuffers/protobuf/releases/tag/v3.7.1下载的,osx-x86_64.zip.我也尝试了3.8.0和3.