17

The Modifier for Exports in the java doc states that

MANDATED The export was implicitly declared in the source of the module declaration.

SYNTHETIC The export was not explicitly or implicitly declared in the source of the module declaration.

Looking at few module-info.classes, I can see that there are generally two types of usages:

module java.base {
    ...
    exports java.util; // type 1
    exports java.util.concurrent;
    exports java.util.concurrent.atomic;
    exports jdk.internal to jdk.jfr; // type 2
    exports jdk.internal.jmod to
        jdk.compiler,
        jdk.jlink;
    ...
}

The Qualified Exports do describe these two types but there is no reference to the enum types. Are these the different types referred in the docs?

Q1. In general SYNTHETIC and MANDATED are modifiers used as in Exports, ModuleDescriptor, Opens and Requires. What is the difference between these two and is one preferred over another in practice?

Q2. Whats an example of a Synthetic Modifier anyway if not declared in the source of the module?

Solomon Ucko
  • 5,724
  • 3
  • 24
  • 45
Naman
  • 27,789
  • 26
  • 218
  • 353
  • 2
    Aren't you the one answering these questions? ;-) – GhostCat Sep 18 '17 at 06:03
  • @GhostCat Haha..I would've to try hard for this one I guess. Just couldn't find a simple reference anywhere. Would rely on the community to come back with some/better details :) – Naman Sep 18 '17 at 06:06
  • 1
    Let's wait for Alan to answer this but I guess that synthetic exports might be those that are created for automatic modules and the unnamed one. Such modules export packages even though they they do not declare an `exports` clause. But I'm really only guessing here... – Nicolai Parlog Sep 18 '17 at 08:04
  • @Nicolai Would await the answer. Even I had thought on the lines of automatic modules here. But the question then would also be what makes a difference between those and mandated? – Naman Sep 18 '17 at 08:10
  • 5
    The JVMS defines the ACC_MANDATED and ACC_SYNTHETIC flags, the enums are just reflecting these flags in the API. If you compile `module m { }` and examine the generated module-info.class with `javap -v` then you'll see that the `requires java.base` has the ACC_MANDATED flag set. It is harder to find examples of modules with ACC_SYNTHETIC set but one example is in the Proxy area when the proxy class is encapsulated. In that scenario, the dynamic module that is generated has the ACC_SYNTHETIC flag set. – Alan Bateman Sep 19 '17 at 11:25
  • @AlanBateman I can't tell why you would not make this an answer and its definitely not about reputation points, but it would be a pity if comments coming from the people themselves that made this would be lost. – Eugene Sep 19 '17 at 20:36
  • @AlanBateman I would second the thought by @ Eugene. The amount of information in that comment is worth keeping a note as an answer. Though I hope I could wait for some more research and experiments from the community to come up for those examples on the line of the thought that you shall share as an answer. :) – Naman Sep 20 '17 at 01:32

1 Answers1

2

Difference in Synthetic and Mandated modifiers is simple - mandate was implicitly declared and synthetic was not implicitly or explicitly declared. There were good articles on that and java specification has detailed explanation about synthetic modifier which was earlier introduced to java. Below details related to the synthetic was extracted from those because of the completeness of the details. Please find the references at the end.

Synthetic:

The Synthetic attribute is a fixed-length attribute in the attributes table of a ClassFile, field_info, or method_info structure (§4.1, §4.5, §4.6). A class member that does not appear in the source code must be marked using a Synthetic attribute, or else it must have its ACC_SYNTHETIC flag set. The only exceptions to this requirement are compiler-generated methods which are not considered implementation artifacts, namely the instance initialization method representing a default constructor of the Java programming language (§2.9), the class initialization method (§2.9), and the Enum.values() and Enum.valueOf() methods. Java synthetic classes, methods and fields are for java runtime’s internal purposes. We may not need to have knowledge about them to write the code.

The Synthetic attribute was introduced in JDK release 1.1 to support nested classes and interfaces.

The Synthetic attribute has the following format:

Synthetic_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
}

The items of the Synthetic_attribute structure are as follows:

attribute_name_index The value of the attribute_name_index item must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Utf8_info (§4.4.7) structure representing the string "Synthetic".

attribute_length The value of the attribute_length item is zero. Uses of Java Synthetic • It might be useful in debugging sessions, when we see those synthetic stuff in stack trace we can understand what it is. • AOP, generics, enums uses Java synthetic. • Java reflection API exposes method to check if an element is synthetic. • A regular java application programmer will not require synthetic for day to day programming. • This knowledge may be required in interviews but that doesn’t mandate that you will use it in the project. When synthetic is created? When an enclosing class accesses a private attribute of a nested class, Java compiler creates synthetic method for that attribute. If there is a getter method available in source then this synthetic method will not be created. Similarly for constructor of inner classes also synthetic is created. There are many occasions, like this where a synthetic field or method or class is created.

Mandated:

The opens package was implicitly declared in the source of the module declaration. This dependence was declared in the module declaration. A mandated construct is the one that is not explicitly declared in the source code, but whose presence is mandated by the specification. Such a construct is said to be implicitly declared. One example of a mandated element is a default constructor in a class that contains no explicit constructor declarations. Another example of a mandated construct is an implicitly declared container annotation used to hold multiple annotations of a repeatable annotation type. Ex:

 Module claim
 requires mandated java.base

Line 1. Defines the module called claim. In line 2 defines every module depends on java.base module except java.base. That means export was implicitly declared in the source module declaration.

References:

lkamal
  • 3,788
  • 1
  • 20
  • 34
  • 1
    Hey! Welcome to stackoverflow and thanks for putting in this much of efforts into answering this. Small request could you please link the document you've addressed and improve the formatting of the answer as well. That would increase its readability. – Naman Oct 03 '17 at 11:24