Synthetic variable or method in Java

While working I found one keyword Synthetic variable or method in java. Never heard of this before.I found some information on net and thought of sharing knowledge with everyone. If you want add something in this ,it would be really great.

“Synthetic” attribute means a variable introduced by the compiler that doesn’t appear in the actual code. It is a compiler-created field that links a local inner class to a block’s local variable or reference type parameter. Synthetic members are only meant to be accessed by trusted code generated by the compiler. Compiler synthesizes certain hidden fields and methods in order to implement the scoping of names. Any constructs introduced by the compiler that do not have a corresponding construct in the source code must be marked as synthetic, except for default constructors and the class initialization method.[1]
it means when there is a field or method introduced into a class file by the compiler and we can not find the primary declaration in the source file, it will marked as synthetic
A synthetic field pointing to the outermost enclosing instance is named this$0. The next-outermost enclosing instance is this$1, and so forth. All these synthetic fields are initialized by constructor parameters, which have the same names as the fields they initialize. If one of the parameters is the innermost enclosing instance, it is the first. All such constructor parameters are deemed to be synthetic. If the compiler determines that the synthetic field’s value is used only in the code of the constructor, it may omit the field itself, and use only the parameter to implement variable references. A non-private final synthetic method which grants access to a private member or constructor has a name of the form access$N, where N is a decimal numeral.
when an inner class has access to an instance of an outer class, this is implemented by creating a synthetic field in the inner class, generally named this$0, which holds a reference to the outer class instance.
According to Java 6 spec – Any constructs introduced by the compiler that do not have a corresponding construct in the source code must be marked as synthetic, except for default constructors and the class initialization method.

Nested classes are sometimes implemented using synthetic fields and synthetic contructors, e.g. an inner class may use a synthetic field to save a reference to its outer class instance, and it may generate a synthetic constructor to set that field correctly.
Synthetic members are how the compiler deals with the fact that nested classes are actually compiled into top-level classes
if a static member type uses a private member of its containing type (or vice versa), the compiler generates synthetic non-private access methods and converts the expressions that access the private methods into expressions that invoke these specially generated methods. These methods are given the default package access which is sufficient, as the member class and its containing class are guaranteed to be in the same package.

Synthetic class is derived from Attribute and declares this class as `synthetic’, i.e., it needs special handling. It is instantiated from the Attribute.readAttribute() method.
According to the JVM Spec: “A class member that does not appear in the source code must be marked using a Synthetic attribute.” Also, “The Synthetic attribute was introduced in JDK release 1.1 to support nested classes and interfaces.
We can check using isSynthetic() method whether variable is synthetic variable or not.
Examples include a static variable to hold a Class object if you’ve used the “Integer.class” notation, and the member variable in a non-static inner class that holds a reference to the enclosing class. Besides the fact that they are inserted by the compiler

See the java doc on – http://bcel.sourceforge.net/docs/de/fub/bytecode/classfile/Synthetic.html

pimp it