gpt4 book ai didi

java - 构造函数是否生成默认构造函数?

转载 作者:太空狗 更新时间:2023-10-29 22:56:20 25 4
gpt4 key购买 nike

有没有办法通过反射找出构造函数是否是编译器生成的默认构造函数?还是有别的办法?

令人惊讶的是,isSynthetic 方法没有提供此信息,因此无法使用。并且不存在 Generated 注释。

public class JavaTest {
public void run() throws Exception {
out.println(JavaTest.class.getConstructors()[0].isSynthetic()); // Prints false
out.println(Arrays.asList(JavaTest.class.getConstructors()[0].getAnnotations())); // Prints []
}
}

这个问题问同样的事情,但对于 C#:Detect compiler generated default constructor using reflection in C#

最佳答案

不,编译器生成它们:

我创建了文件 A.java:

public class A{
public String t(){return "";}
}

然后:

javac A.java

并运行 javap -c A 来查看内容:

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

public java.lang.String t();
Code:
0: ldc #2 // String
2: areturn
}

如果我添加构造函数:

public A(){}

结果是:

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

public java.lang.String t();
Code:
0: ldc #2 // String
2: areturn
}

完全一样。我使用的是带有 64 位 OpenJDK 的 Java 7,但我敢打赌所有版本都一样。

编辑:事实上,相同的字节码本身并不能保证信息不会作为元数据出现。使用十六进制编辑器和 this program可以看到有两个字节不同,并且对应于行号(用于打印堆栈跟踪),因此在这种情况下没有信息。

关于java - 构造函数是否生成默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com