FULL PRODUCT VERSION :
javac on apple box: 1.6.0_13
javac in windows box: 1.6.0_14 (latest at time of writing)
ADDITIONAL OS VERSION INFORMATION :
Tested on both mac os x with apple VM and windows with sun VM.
Apple box: Darwin hostname.local 9.7.0 Darwin Kernel Version 9.7.0: Tue Mar 31 22:52:17 PDT 2009; root:xnu-1228.12.14~1/RELEASE_I386 i386
Win box: Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
//Stuff the following snippet in a file and compile it:
//This code has been carefully distilled to be the simplest possible thing that causes
//the problem.
//Compiling this on javac 1.6.0_13 causes the following problem:
// annotation A is missing <clinit>
@interface A {
//Compile time constants will NOT trigger the error, but 'null' is not a CTC.
String B = null;
}
class C {
private @A int d;
}
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the code given in the description. Javac prints an error even though the code is valid.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The code should compile normally. To be specific, there *IS* a <clinit>, which you can see by compiling the @interface separately, and using javap to see that there's a static block that initializes the constant. Therefore, javac is erroneously reporting that the @interface has no <clinit>.
ACTUAL -
See "Error Messages".
ERROR MESSAGES/STACK TRACES THAT OCCUR :
foo.java:13: annotation A is missing <clinit>
private @A int d;
^
1 error
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
@interface A {
//Compile time constants will NOT trigger the error, but 'null' is not a CTC.
String B = null;
}
class C {
private @A int d;
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Move the constants into another class.
Copying comments from http://bugs.openjdk.java.net/show_bug.cgi?id=100199
Description From Rideg Sándor 2011-08-06 16:02:43 PDT
TESTED VERSIONS: 1.7.0, 1.6.0_26
DESCRIPTION:
try to complie the following code:
@interface MyAnnotation {
Object OBJECT = new Object();
}
@MyAnnotation()
public class MainClass {}
RESULT:
>javac MainClass.java
MainClass.java:6: annotation MyAnnotation is missing <clinit>
@MyAnnotation()
^
1 error
NOTE: I've found the same bugreport at
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6857918
Comment #1 From Rideg Sándor 2011-08-06 16:27:34 PDT
Created an attachment (id=226) [details]
diff against jdk7-b147
With this fix <clinit> wont be treaten as a member when validating annotation
in
com.sun.tools.javac.comp.Check.validateAnnotation().
Comment #2 From Tim Bell 2012-07-09 19:53:16 PDT
Closing. This is SUNBUG 6857918
javac on apple box: 1.6.0_13
javac in windows box: 1.6.0_14 (latest at time of writing)
ADDITIONAL OS VERSION INFORMATION :
Tested on both mac os x with apple VM and windows with sun VM.
Apple box: Darwin hostname.local 9.7.0 Darwin Kernel Version 9.7.0: Tue Mar 31 22:52:17 PDT 2009; root:xnu-1228.12.14~1/RELEASE_I386 i386
Win box: Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
//Stuff the following snippet in a file and compile it:
//This code has been carefully distilled to be the simplest possible thing that causes
//the problem.
//Compiling this on javac 1.6.0_13 causes the following problem:
// annotation A is missing <clinit>
@interface A {
//Compile time constants will NOT trigger the error, but 'null' is not a CTC.
String B = null;
}
class C {
private @A int d;
}
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile the code given in the description. Javac prints an error even though the code is valid.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The code should compile normally. To be specific, there *IS* a <clinit>, which you can see by compiling the @interface separately, and using javap to see that there's a static block that initializes the constant. Therefore, javac is erroneously reporting that the @interface has no <clinit>.
ACTUAL -
See "Error Messages".
ERROR MESSAGES/STACK TRACES THAT OCCUR :
foo.java:13: annotation A is missing <clinit>
private @A int d;
^
1 error
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
@interface A {
//Compile time constants will NOT trigger the error, but 'null' is not a CTC.
String B = null;
}
class C {
private @A int d;
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Move the constants into another class.
Copying comments from http://bugs.openjdk.java.net/show_bug.cgi?id=100199
Description From Rideg Sándor 2011-08-06 16:02:43 PDT
TESTED VERSIONS: 1.7.0, 1.6.0_26
DESCRIPTION:
try to complie the following code:
@interface MyAnnotation {
Object OBJECT = new Object();
}
@MyAnnotation()
public class MainClass {}
RESULT:
>javac MainClass.java
MainClass.java:6: annotation MyAnnotation is missing <clinit>
@MyAnnotation()
^
1 error
NOTE: I've found the same bugreport at
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6857918
Comment #1 From Rideg Sándor 2011-08-06 16:27:34 PDT
Created an attachment (id=226) [details]
diff against jdk7-b147
With this fix <clinit> wont be treaten as a member when validating annotation
in
com.sun.tools.javac.comp.Check.validateAnnotation().
Comment #2 From Tim Bell 2012-07-09 19:53:16 PDT
Closing. This is SUNBUG 6857918
- duplicates
-
JDK-8011027 Type parameter annotations not passed through to javax.lang.model
-
- Closed
-
- relates to
-
JDK-6982543 Annotations cannot contain member fields of type Class<?>
-
- Closed
-