Is constructor generated default constructor?

后端 未结 2 1511
一向
一向 2021-02-19 04:52

Is there a way to find out by reflection whether a constructor is a compiler generated default constructor or not? Or is there some other way?

Surprisingly the isS

2条回答
  •  青春惊慌失措
    2021-02-19 05:38

    No, the compiler generates them:

    I created the file A.java:

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

    then:

    javac A.java
    

    and running javap -c A to see the content:

    Compiled from "A.java"
    public class A {
      public A();
        Code:
           0: aload_0       
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return        
    
      public java.lang.String t();
        Code:
           0: ldc           #2                  // String 
           2: areturn       
    }
    

    if I add the constructor:

    public A(){}
    

    the result is:

    Compiled from "A.java"
    public class A {
      public A();
        Code:
           0: aload_0       
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return        
    
      public java.lang.String t();
        Code:
           0: ldc           #2                  // String 
           2: areturn       
    }
    

    it's identical. I'm using Java 7 with 64 bit OpenJDK, but I'd bet that it's the same with all the versions.

    EDIT: in fact, the same bytecode alone doesn't guarantee that the information is not present as metadata. Using an hex editor and this program was possible to see that there are two bytes differing, and correspond to the line numbers (used for printing stack traces), so the information is absent in this case.

提交回复
热议问题