According to Oracle documentation on this, there is indeed code being generated, but it differs according to the type of the used obejct.
If you are using an array, the foreach loop will be translated as a for loop with index:
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
VariableModifiersopt TargetType Identifier = #a[#i];
Statement
}
If you have an Iterable object, you get a loop with iterator like this:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiersopt TargetType Identifier = (TargetType) #i.next();
Statement
}