package org.simantics.scl.compiler.tests.experimentation; import java.io.PrintWriter; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicReference; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.util.TraceClassVisitor; public class RecursiveInitialization { public static void main(String[] args) throws Exception { ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor classVisitor = new TraceClassVisitor(classWriter, new PrintWriter(System.out)); classVisitor.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "test/Test", null, "java/lang/Object", new String[0]); MethodVisitor methodWriter = classVisitor.visitMethod( Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "main", "()Ljava/lang/Object;", null, null); methodWriter.visitCode(); methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference"); methodWriter.visitVarInsn(Opcodes.ASTORE, 2); methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference"); methodWriter.visitVarInsn(Opcodes.ASTORE, 1); methodWriter.visitVarInsn(Opcodes.ALOAD, 2); methodWriter.visitVarInsn(Opcodes.ALOAD, 1); //methodWriter.visitInsn(Opcodes.ACONST_NULL); methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "", "(Ljava/lang/Object;)V", false); methodWriter.visitVarInsn(Opcodes.ALOAD, 1); methodWriter.visitVarInsn(Opcodes.ALOAD, 2); methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "", "(Ljava/lang/Object;)V", false); methodWriter.visitVarInsn(Opcodes.ALOAD, 2); methodWriter.visitInsn(Opcodes.ARETURN); methodWriter.visitMaxs(0, 0); methodWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); ClassLoader classLoader = new ClassLoader() { @Override protected Class findClass(String name) throws ClassNotFoundException { if(!name.equals("test.Test")) throw new ClassNotFoundException(); return defineClass("test.Test", bytes, 0, bytes.length); } }; Class clazz = classLoader.loadClass("test.Test"); Method method = clazz.getMethod("main"); AtomicReference result = (AtomicReference)method.invoke(null); System.out.println(result.hashCode()); //System.out.println(result.get().hashCode()); } }