21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 /*
27 * Create class file using ASM, slightly modified the ASMifier output
28 */
29
30
31
32 import java.io.File;
33 import java.io.FileOutputStream;
34 import java.io.IOException;
35 import jdk.internal.org.objectweb.asm.*;
36
37
38 public class ClassFileGenerator {
39
40 public static void main(String... args) throws Exception {
41 classFileWriter("AnnotationWithVoidReturn.class", AnnoationWithVoidReturnDump.dump());
42 classFileWriter("AnnotationWithParameter.class", AnnoationWithParameterDump.dump());
43 classFileWriter("AnnotationWithExtraInterface.class", AnnotationWithExtraInterfaceDump.dump());
44 classFileWriter("AnnotationWithException.class", AnnotationWithExceptionDump.dump());
45 classFileWriter("AnnotationWithHashCode.class", AnnotationWithHashCodeDump.dump());
46 classFileWriter("AnnotationWithDefaultMember.class", AnnotationWithDefaultMemberDump.dump());
47 classFileWriter("AnnotationWithoutAnnotationAccessModifier.class",
48 AnnotationWithoutAnnotationAccessModifierDump.dump());
49 classFileWriter("HolderX.class", HolderXDump.dump());
50 }
51
52 private static void classFileWriter(String name, byte[] contents) throws IOException {
53 try (FileOutputStream fos = new FileOutputStream(new File(System.getProperty("test.classes"),
54 name))) {
55 fos.write(contents);
56 }
57 }
58
59 /* Following code creates equivalent classfile, which is not allowed by javac:
60
61 @Retention(RetentionPolicy.RUNTIME)
62 public @interface AnnotationWithVoidReturn {
63 void m() default 1;
64 }
65
66 */
67
68 private static class AnnoationWithVoidReturnDump implements Opcodes {
69 public static byte[] dump() throws Exception {
70 ClassWriter cw = new ClassWriter(0);
71 MethodVisitor mv;
72 AnnotationVisitor av0;
73
74 cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
75 "AnnotationWithVoidReturn", null,
76 "java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
77
78 {
79 av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
80 av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
81 "RUNTIME");
82 av0.visitEnd();
83 }
84 {
85 mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()V", null, null);
86 mv.visitEnd();
87 }
88 {
89 av0 = mv.visitAnnotationDefault();
90 av0.visit(null, new Integer(1));
91 av0.visitEnd();
92 }
93 cw.visitEnd();
94
95 return cw.toByteArray();
96
97 }
98 }
99
100 /* Following code creates equivalent classfile, which is not allowed by javac:
101
102 @Retention(RetentionPolicy.RUNTIME)
103 public @interface AnnotationWithParameter {
104 int m(int x) default -1;
105 }
106
107 */
108
109 private static class AnnoationWithParameterDump implements Opcodes {
110 public static byte[] dump() throws Exception {
111
112 ClassWriter cw = new ClassWriter(0);
113 MethodVisitor mv;
114 AnnotationVisitor av0;
115
116 cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
117 "AnnotationWithParameter", null,
118 "java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
119
120 {
121 av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
122 av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
123 "RUNTIME");
124 av0.visitEnd();
125 }
126 {
127 mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT,
128 "badValue",
129 "(I)I", // Bad method with a parameter
|
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 /*
27 * Create class file using ASM, slightly modified the ASMifier output
28 */
29
30
31
32 import java.io.File;
33 import java.io.FileOutputStream;
34 import java.io.IOException;
35 import jdk.internal.org.objectweb.asm.*;
36
37
38 public class ClassFileGenerator {
39
40 public static void main(String... args) throws Exception {
41 classFileWriter("AnnotationWithVoidReturn.class", AnnotationWithVoidReturnDump.dump());
42 classFileWriter("AnnotationWithParameter.class", AnnotationWithParameterDump.dump());
43 classFileWriter("AnnotationWithExtraInterface.class", AnnotationWithExtraInterfaceDump.dump());
44 classFileWriter("AnnotationWithException.class", AnnotationWithExceptionDump.dump());
45 classFileWriter("AnnotationWithHashCode.class", AnnotationWithHashCodeDump.dump());
46 classFileWriter("AnnotationWithDefaultMember.class", AnnotationWithDefaultMemberDump.dump());
47 classFileWriter("AnnotationWithoutAnnotationAccessModifier.class",
48 AnnotationWithoutAnnotationAccessModifierDump.dump());
49 classFileWriter("HolderX.class", HolderXDump.dump());
50 }
51
52 private static void classFileWriter(String name, byte[] contents) throws IOException {
53 try (FileOutputStream fos = new FileOutputStream(new File(System.getProperty("test.classes"),
54 name))) {
55 fos.write(contents);
56 }
57 }
58
59 /* Following code creates equivalent classfile, which is not allowed by javac:
60
61 @Retention(RetentionPolicy.RUNTIME)
62 public @interface AnnotationWithVoidReturn {
63 void m() default 1;
64 }
65
66 */
67
68 private static class AnnotationWithVoidReturnDump implements Opcodes {
69 public static byte[] dump() throws Exception {
70 ClassWriter cw = new ClassWriter(0);
71 MethodVisitor mv;
72 AnnotationVisitor av0;
73
74 cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
75 "AnnotationWithVoidReturn", null,
76 "java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
77
78 {
79 av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
80 av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
81 "RUNTIME");
82 av0.visitEnd();
83 }
84 {
85 mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()V", null, null);
86 mv.visitEnd();
87 }
88 {
89 av0 = mv.visitAnnotationDefault();
90 av0.visit(null, new Integer(1));
91 av0.visitEnd();
92 }
93 cw.visitEnd();
94
95 return cw.toByteArray();
96
97 }
98 }
99
100 /* Following code creates equivalent classfile, which is not allowed by javac:
101
102 @Retention(RetentionPolicy.RUNTIME)
103 public @interface AnnotationWithParameter {
104 int m(int x) default -1;
105 }
106
107 */
108
109 private static class AnnotationWithParameterDump implements Opcodes {
110 public static byte[] dump() throws Exception {
111
112 ClassWriter cw = new ClassWriter(0);
113 MethodVisitor mv;
114 AnnotationVisitor av0;
115
116 cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,
117 "AnnotationWithParameter", null,
118 "java/lang/Object", new String[]{"java/lang/annotation/Annotation"});
119
120 {
121 av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);
122 av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",
123 "RUNTIME");
124 av0.visitEnd();
125 }
126 {
127 mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT,
128 "badValue",
129 "(I)I", // Bad method with a parameter
|