下面列出了org.objectweb.asm.ClassWriter#visitInnerClass ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static byte[] getNestedInterfaceCalledFIELDSLevelOne() {
ClassWriter classWriter = new ClassWriter(0);
FieldVisitor fieldVisitor;
classWriter.visit(V10, ACC_ABSTRACT | ACC_INTERFACE, "NestedInterfaces$FIELDS", null, "java/lang/Object", null);
classWriter.visitSource("NestedInterfaces.java", null);
classWriter.visitInnerClass("NestedInterfaces$FIELDS", "NestedInterfaces", "FIELDS", ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
classWriter.visitInnerClass("NestedInterfaces$FIELDS$FIELDS", "NestedInterfaces$FIELDS", "FIELDS", ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
{
fieldVisitor = classWriter.visitField(ACC_PUBLIC | ACC_FINAL | ACC_STATIC, "a", "I", null, Integer.valueOf(101));
fieldVisitor.visitEnd();
}
classWriter.visitEnd();
return classWriter.toByteArray();
}
public static byte[] generateClass() {
ClassWriter cw = new ClassWriter(0);
cw.visit(52, ACC_SUPER | ACC_PUBLIC, INNER_CLASS_NAME_INTERNAL, null, "java/lang/Object", null);
cw.visitSource("UnbalancedMonitorsTest.java", null);
cw.visitInnerClass(INNER_CLASS_NAME_INTERNAL, CLASS_NAME_INTERNAL, "UnbalancedMonitors", ACC_STATIC);
visitConstructor(cw);
visitWrongOrder(cw);
visitBlockStructured(cw, true, false);
visitBlockStructured(cw, true, true);
visitBlockStructured(cw, false, false);
visitBlockStructured(cw, false, true);
cw.visitEnd();
return cw.toByteArray();
}
@Test
public void innerClass() {
ClassWriter cw = new ClassWriter(0);
cw.visit(52, Opcodes.ACC_SUPER, "test/Hello$Inner", null, "java/lang/Object", null);
cw.visitInnerClass(
"test/Hello$Inner", "test/Hello", "Inner", Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE);
cw.visitInnerClass("test/Hello$Inner$InnerMost", "test/Hello$Inner", "InnerMost", 0);
byte[] bytes = cw.toByteArray();
ClassFile classFile = com.google.turbine.bytecode.ClassReader.read(null, bytes);
assertThat(classFile.innerClasses()).hasSize(2);
ClassFile.InnerClass a = classFile.innerClasses().get(0);
assertThat(a.access()).isEqualTo(TurbineFlag.ACC_STATIC | TurbineFlag.ACC_PRIVATE);
assertThat(a.innerName()).isEqualTo("Inner");
assertThat(a.innerClass()).isEqualTo("test/Hello$Inner");
assertThat(a.outerClass()).isEqualTo("test/Hello");
ClassFile.InnerClass b = classFile.innerClasses().get(1);
assertThat(b.innerName()).isEqualTo("InnerMost");
assertThat(b.innerClass()).isEqualTo("test/Hello$Inner$InnerMost");
assertThat(b.outerClass()).isEqualTo("test/Hello$Inner");
}
private String writeInnerClassHeader(
String fullyQualifiedOuterClass, String innerClass, ClassWriter innerClassWriter) {
String fullyQualifiedInnerClass = fullyQualifiedOuterClass + "$" + innerClass;
innerClassWriter.visit(
JAVA_VERSION,
Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_SUPER,
fullyQualifiedInnerClass,
null, /* signature */
SUPER_CLASS,
null /* interfaces */);
innerClassWriter.visitSource(SdkConstants.FN_RESOURCE_CLASS, null);
writeConstructor(innerClassWriter);
innerClassWriter.visitInnerClass(
fullyQualifiedInnerClass,
fullyQualifiedOuterClass,
innerClass,
Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC);
return fullyQualifiedInnerClass;
}
public static byte[] getInnerFILEDSInterfaceBytes() {
ClassWriter classWriter = new ClassWriter(0);
MethodVisitor methodVisitor;
classWriter.visit(V10, ACC_PUBLIC | ACC_SUPER, "NestedInterfaces", null, "java/lang/Object", null);
classWriter.visitSource("NestedInterfaces.java", null);
classWriter.visitInnerClass("NestedInterfaces$FIELDS", "NestedInterfaces", "FIELDS", ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
classWriter.visitInnerClass("NestedInterfaces$FIELDS$FIELDS", "NestedInterfaces$FIELDS", "FIELDS", ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
{
methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
methodVisitor.visitCode();
Label label0 = new Label();
methodVisitor.visitLabel(label0);
methodVisitor.visitLineNumber(3, label0);
methodVisitor.visitVarInsn(ALOAD, 0);
methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
methodVisitor.visitInsn(RETURN);
methodVisitor.visitMaxs(1, 1);
methodVisitor.visitEnd();
}
classWriter.visitEnd();
return classWriter.toByteArray();
}
public static byte[] getNestedInterfaceCalledFIELDSLevelTwo() {
ClassWriter classWriter = new ClassWriter(0);
FieldVisitor fieldVisitor;
MethodVisitor methodVisitor;
classWriter.visit(V10, ACC_PUBLIC | ACC_ABSTRACT | ACC_INTERFACE, "NestedInterfaces$FIELDS$FIELDS", null, "java/lang/Object", null);
classWriter.visitSource("NestedInterfaces.java", null);
classWriter.visitInnerClass("NestedInterfaces$FIELDS", "NestedInterfaces", "FIELDS", ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
classWriter.visitInnerClass("NestedInterfaces$FIELDS$FIELDS", "NestedInterfaces$FIELDS", "FIELDS", ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
{
fieldVisitor = classWriter.visitField(ACC_PUBLIC | ACC_FINAL | ACC_STATIC, "b", "I", null, null);
fieldVisitor.visitEnd();
}
{
methodVisitor = classWriter.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
methodVisitor.visitCode();
Label label0 = new Label();
methodVisitor.visitLabel(label0);
methodVisitor.visitLineNumber(7, label0);
methodVisitor.visitTypeInsn(NEW, "java/lang/Object");
methodVisitor.visitInsn(DUP);
methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false);
methodVisitor.visitFieldInsn(PUTSTATIC, "NestedInterfaces$FIELDS$FIELDS", "b", "I");
methodVisitor.visitInsn(RETURN);
methodVisitor.visitMaxs(2, 0);
methodVisitor.visitEnd();
}
classWriter.visitEnd();
return classWriter.toByteArray();
}
private static byte[] createInterface() {
ClassWriter cw = new ClassWriter(0);
MethodVisitor mv;
cw.visit(
V1_8,
ACC_PUBLIC | ACC_ABSTRACT | ACC_INTERFACE,
INTERFACE_TYPE_NAME,
null,
"java/lang/Object",
null);
cw.visitInnerClass(
INTERFACE_TYPE_NAME,
CLASS_NAME,
"Interface",
ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
{
mv =
cw.visitMethod(
ACC_PUBLIC | ACC_ABSTRACT,
"call",
"(Ljava/lang/String;)Ljava/lang/String;",
null,
null);
mv.visitParameter("input", 0);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
private static byte[] generateClass() {
ClassWriter cw = new ClassWriter(0);
MethodVisitor mv;
cw.visit(52, ACC_SUPER, PACKAGE_NAME_INTERNAL + "/ConstantPoolTest", null, "java/lang/Object", null);
cw.visitInnerClass(PACKAGE_NAME_INTERNAL + "/ConstantPoolTest", PACKAGE_NAME_INTERNAL + "/ConstantPoolSubstitutionsTests", "ConstantPoolTest",
ACC_STATIC);
String constantPool = Java8OrEarlier ? "sun/reflect/ConstantPool" : "jdk/internal/reflect/ConstantPool";
mv = cw.visitMethod(0, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "getSize", "(Ljava/lang/Object;)I", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(CHECKCAST, constantPool);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, constantPool, "getSize", "()I", false);
mv.visitInsn(IRETURN);
mv.visitMaxs(1, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "getIntAt", "(Ljava/lang/Object;)I", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(CHECKCAST, constantPool);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKEVIRTUAL, constantPool, "getIntAt", "(I)I", false);
mv.visitInsn(IRETURN);
mv.visitMaxs(2, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "getLongAt", "(Ljava/lang/Object;)J", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(CHECKCAST, constantPool);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKEVIRTUAL, constantPool, "getLongAt", "(I)J", false);
mv.visitInsn(LRETURN);
mv.visitMaxs(2, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "getFloatAt", "(Ljava/lang/Object;)F", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(CHECKCAST, constantPool);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKEVIRTUAL, constantPool, "getFloatAt", "(I)F", false);
mv.visitInsn(FRETURN);
mv.visitMaxs(2, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "getDoubleAt", "(Ljava/lang/Object;)D", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(CHECKCAST, constantPool);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKEVIRTUAL, constantPool, "getDoubleAt", "(I)D", false);
mv.visitInsn(DRETURN);
mv.visitMaxs(2, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "getUTF8At", "(Ljava/lang/Object;)Ljava/lang/String;", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(CHECKCAST, constantPool);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(ICONST_0);
mv.visitMethodInsn(INVOKEVIRTUAL, constantPool, "getUTF8At", "(I)Ljava/lang/String;", false);
mv.visitInsn(ARETURN);
mv.visitMaxs(2, 3);
mv.visitEnd();
cw.visitEnd();
return cw.toByteArray();
}
static byte[] createImpl(String implName, ClassInfo classInfo) {
ClassWriter cw = new ClassWriter(0);
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER,
implName.replace('.', '/'),
null,
"java/lang/Object",
new String[]{classInfo.name().toString().replace('.', '/')}
);
int lastDot = implName.lastIndexOf('.');
String simpleName = implName.substring(lastDot + 1);
cw.visitSource(simpleName + ".java", null);
{
av0 = cw.visitAnnotation("Ljavax/enterprise/context/ApplicationScoped;", true);
av0.visitEnd();
}
cw.visitInnerClass("javax/ws/rs/client/Invocation$Builder", "javax/ws/rs/client/Invocation", "Builder", ACC_PUBLIC + ACC_STATIC + ACC_ABSTRACT + ACC_INTERFACE);
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(14, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(15, l1);
mv.visitInsn(RETURN);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLocalVariable("this",
buildTypeDef(implName),
null,
l0,
l2,
0);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
List<AnnotationInstance> annotations = classInfo.annotations().get(DotName.createSimple("org.wildfly.swarm.client.jaxrs.Service"));
String baseUrl = (String) annotations.get(0).value("baseUrl").value();
int lineNum = 18;
classInfo.asClass().methods()
.stream()
.forEachOrdered(method -> {
createMethod(cw, implName, classInfo.name().toString(), method, lineNum, baseUrl);
});
cw.visitEnd();
return cw.toByteArray();
}