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
No, there is no metadata in the bytecode that would allow you to distinguish a compiler generated default constructor from a non-generated one.
In most cases, compiler generated constructors and methods are marked with the ACC_SYNTHETIC
flag or the Synthetic
attribute in the generated bytecode. However, there are a few notable exceptions as per 13.1 item 7 from the Java Language Spec and 4.7.8 from the jvm-spec
Here is the relevant bit from the JLS:
Any constructs introduced by a Java compiler that do not have a corresponding construct in the source code must be marked as synthetic, except for default constructors, the class initialization method, and the values and valueOf methods of the Enum class
As far as I know, javap
does not show the ACC_SYNTHETIC
flag but you would be able to read it through isSynthetic
if it was set.