Path: blob/master/test/jdk/java/lang/annotation/ClassFileGenerator.java
41152 views
/*1* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425/*26* Create class file using ASM, slightly modified the ASMifier output27*/28293031import java.io.File;32import java.io.FileOutputStream;33import java.io.IOException;34import jdk.internal.org.objectweb.asm.*;353637public class ClassFileGenerator {3839public static void main(String... args) throws Exception {40classFileWriter("AnnotationWithVoidReturn.class", AnnotationWithVoidReturnDump.dump());41classFileWriter("AnnotationWithParameter.class", AnnotationWithParameterDump.dump());42classFileWriter("AnnotationWithExtraInterface.class", AnnotationWithExtraInterfaceDump.dump());43classFileWriter("AnnotationWithException.class", AnnotationWithExceptionDump.dump());44classFileWriter("AnnotationWithHashCode.class", AnnotationWithHashCodeDump.dump());45classFileWriter("AnnotationWithDefaultMember.class", AnnotationWithDefaultMemberDump.dump());46classFileWriter("AnnotationWithoutAnnotationAccessModifier.class",47AnnotationWithoutAnnotationAccessModifierDump.dump());48classFileWriter("HolderX.class", HolderXDump.dump());49}5051private static void classFileWriter(String name, byte[] contents) throws IOException {52try (FileOutputStream fos = new FileOutputStream(new File(System.getProperty("test.classes"),53name))) {54fos.write(contents);55}56}5758/* Following code creates equivalent classfile, which is not allowed by javac:5960@Retention(RetentionPolicy.RUNTIME)61public @interface AnnotationWithVoidReturn {62void m() default 1;63}6465*/6667private static class AnnotationWithVoidReturnDump implements Opcodes {68public static byte[] dump() throws Exception {69ClassWriter cw = new ClassWriter(0);70MethodVisitor mv;71AnnotationVisitor av0;7273cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,74"AnnotationWithVoidReturn", null,75"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});7677{78av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);79av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",80"RUNTIME");81av0.visitEnd();82}83{84mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()V", null, null);85mv.visitEnd();86}87{88av0 = mv.visitAnnotationDefault();89av0.visit(null, new Integer(1));90av0.visitEnd();91}92cw.visitEnd();9394return cw.toByteArray();9596}97}9899/* Following code creates equivalent classfile, which is not allowed by javac:100101@Retention(RetentionPolicy.RUNTIME)102public @interface AnnotationWithParameter {103int m(int x) default -1;104}105106*/107108private static class AnnotationWithParameterDump implements Opcodes {109public static byte[] dump() throws Exception {110111ClassWriter cw = new ClassWriter(0);112MethodVisitor mv;113AnnotationVisitor av0;114115cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,116"AnnotationWithParameter", null,117"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});118119{120av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);121av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",122"RUNTIME");123av0.visitEnd();124}125{126mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT,127"badValue",128"(I)I", // Bad method with a parameter129null, null);130mv.visitEnd();131}132{133av0 = mv.visitAnnotationDefault();134av0.visit(null, new Integer(-1));135av0.visitEnd();136}137cw.visitEnd();138139return cw.toByteArray();140}141}142143/* Following code creates equivalent classfile, which is not allowed by javac:144145@Retention(RetentionPolicy.RUNTIME)146public @interface AnnotationWithExtraInterface extends java.io.Serializable {147int m() default 1;148}149150*/151152private static class AnnotationWithExtraInterfaceDump implements Opcodes {153public static byte[] dump() throws Exception {154ClassWriter cw = new ClassWriter(0);155MethodVisitor mv;156AnnotationVisitor av0;157158cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,159"AnnotationWithExtraInterface", null,160"java/lang/Object", new String[]{"java/lang/annotation/Annotation",161"java/io/Serializable"});162163{164av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);165av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",166"RUNTIME");167av0.visitEnd();168}169{170mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null);171mv.visitEnd();172}173{174av0 = mv.visitAnnotationDefault();175av0.visit(null, new Integer(1));176av0.visitEnd();177}178cw.visitEnd();179180return cw.toByteArray();181}182}183184/* Following code creates equivalent classfile, which is not allowed by javac:185186@Retention(RetentionPolicy.RUNTIME)187public @interface AnnotationWithException {188int m() throws Exception default 1;189}190191*/192193private static class AnnotationWithExceptionDump implements Opcodes {194public static byte[] dump() throws Exception {195ClassWriter cw = new ClassWriter(0);196MethodVisitor mv;197AnnotationVisitor av0;198199cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,200"AnnotationWithException", null,201"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});202203{204av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);205av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",206"RUNTIME");207av0.visitEnd();208}209{210mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null,211new String[] {"java/lang/Exception"});212mv.visitEnd();213}214{215av0 = mv.visitAnnotationDefault();216av0.visit(null, new Integer(1));217av0.visitEnd();218}219cw.visitEnd();220221return cw.toByteArray();222}223}224225/* Following code creates equivalent classfile, which is not allowed by javac:226227@Retention(RetentionPolicy.RUNTIME)228public @interface AnnotationWithHashCode {229int hashCode() default 1;230}231232*/233234private static class AnnotationWithHashCodeDump implements Opcodes {235public static byte[] dump() throws Exception {236ClassWriter cw = new ClassWriter(0);237MethodVisitor mv;238AnnotationVisitor av0;239240cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,241"AnnotationWithHashCode", null,242"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});243244{245av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);246av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",247"RUNTIME");248av0.visitEnd();249}250{251mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "hashCode", "()I", null, null);252mv.visitEnd();253}254{255av0 = mv.visitAnnotationDefault();256av0.visit(null, new Integer(1));257av0.visitEnd();258}259cw.visitEnd();260261return cw.toByteArray();262}263}264265/* Following code creates equivalent classfile, which is not allowed by javac:266267@Retention(RetentionPolicy.RUNTIME)268public @interface AnnotationWithDefaultMember {269int m() default 1;270default int d() default 2 { return 2; }271}272273*/274275private static class AnnotationWithDefaultMemberDump implements Opcodes {276public static byte[] dump() throws Exception {277ClassWriter cw = new ClassWriter(0);278MethodVisitor mv, dv;279AnnotationVisitor av0;280281cw.visit(52, ACC_PUBLIC + ACC_ANNOTATION + ACC_ABSTRACT + ACC_INTERFACE,282"AnnotationWithDefaultMember", null,283"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});284285{286av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);287av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",288"RUNTIME");289av0.visitEnd();290}291{292mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null);293mv.visitEnd();294}295{296av0 = mv.visitAnnotationDefault();297av0.visit(null, new Integer(1));298av0.visitEnd();299}300{301dv = cw.visitMethod(ACC_PUBLIC, "d", "()I", null, null);302dv.visitMaxs(1, 1);303dv.visitCode();304dv.visitInsn(Opcodes.ICONST_2);305dv.visitInsn(Opcodes.IRETURN);306dv.visitEnd();307}308{309av0 = dv.visitAnnotationDefault();310av0.visit(null, new Integer(2));311av0.visitEnd();312}313cw.visitEnd();314315return cw.toByteArray();316}317}318319/* Following code creates equivalent classfile, which is not allowed by javac:320321@Retention(RetentionPolicy.RUNTIME)322public interface AnnotationWithoutAnnotationAccessModifier extends java.lang.annotation.Annotation {323int m() default 1;324}325326*/327328private static class AnnotationWithoutAnnotationAccessModifierDump implements Opcodes {329public static byte[] dump() throws Exception {330ClassWriter cw = new ClassWriter(0);331MethodVisitor mv;332AnnotationVisitor av0;333334cw.visit(52, ACC_PUBLIC + /* ACC_ANNOTATION +*/ ACC_ABSTRACT + ACC_INTERFACE,335"AnnotationWithoutAnnotationAccessModifier", null,336"java/lang/Object", new String[]{"java/lang/annotation/Annotation"});337338{339av0 = cw.visitAnnotation("Ljava/lang/annotation/Retention;", true);340av0.visitEnum("value", "Ljava/lang/annotation/RetentionPolicy;",341"RUNTIME");342av0.visitEnd();343}344{345mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null);346mv.visitEnd();347}348{349av0 = mv.visitAnnotationDefault();350av0.visit(null, new Integer(1));351av0.visitEnd();352}353cw.visitEnd();354355return cw.toByteArray();356}357}358359/* Following code creates equivalent classfile, which is not allowed by javac360since AnnotationWithoutAnnotationAccessModifier is not marked with ACC_ANNOTATION:361362@GoodAnnotation363@AnnotationWithoutAnnotationAccessModifier364public interface HolderX {365}366367*/368369private static class HolderXDump implements Opcodes {370public static byte[] dump() throws Exception {371ClassWriter cw = new ClassWriter(0);372373cw.visit(52, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE,374"HolderX", null,375"java/lang/Object", new String[0]);376377{378AnnotationVisitor av0;379av0 = cw.visitAnnotation("LGoodAnnotation;", true);380av0.visitEnd();381av0 = cw.visitAnnotation("LAnnotationWithoutAnnotationAccessModifier;", true);382av0.visitEnd();383}384cw.visitEnd();385386return cw.toByteArray();387}388}389}390391392