1 package org.simantics.scl.compiler.tests.experimentation;
3 import java.io.PrintWriter;
4 import java.lang.reflect.Method;
5 import java.util.concurrent.atomic.AtomicReference;
7 import org.objectweb.asm.ClassVisitor;
8 import org.objectweb.asm.ClassWriter;
9 import org.objectweb.asm.MethodVisitor;
10 import org.objectweb.asm.Opcodes;
11 import org.objectweb.asm.util.TraceClassVisitor;
13 public class RecursiveInitialization {
15 public static void main(String[] args) throws Exception {
16 ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
17 ClassVisitor classVisitor = new TraceClassVisitor(classWriter, new PrintWriter(System.out));
18 classVisitor.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "test/Test", null, "java/lang/Object", new String[0]);
19 MethodVisitor methodWriter = classVisitor.visitMethod(
20 Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
21 "main", "()Ljava/lang/Object;", null, null);
23 methodWriter.visitCode();
24 methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");
25 methodWriter.visitVarInsn(Opcodes.ASTORE, 2);
27 methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");
28 methodWriter.visitVarInsn(Opcodes.ASTORE, 1);
30 methodWriter.visitVarInsn(Opcodes.ALOAD, 2);
31 methodWriter.visitVarInsn(Opcodes.ALOAD, 1);
32 //methodWriter.visitInsn(Opcodes.ACONST_NULL);
33 methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "<init>", "(Ljava/lang/Object;)V", false);
35 methodWriter.visitVarInsn(Opcodes.ALOAD, 1);
36 methodWriter.visitVarInsn(Opcodes.ALOAD, 2);
37 methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "<init>", "(Ljava/lang/Object;)V", false);
39 methodWriter.visitVarInsn(Opcodes.ALOAD, 2);
40 methodWriter.visitInsn(Opcodes.ARETURN);
41 methodWriter.visitMaxs(0, 0);
42 methodWriter.visitEnd();
44 byte[] bytes = classWriter.toByteArray();
45 ClassLoader classLoader = new ClassLoader() {
47 protected Class<?> findClass(String name) throws ClassNotFoundException {
48 if(!name.equals("test.Test"))
49 throw new ClassNotFoundException();
50 return defineClass("test.Test", bytes, 0, bytes.length);
53 Class<?> clazz = classLoader.loadClass("test.Test");
54 Method method = clazz.getMethod("main");
55 AtomicReference<Object> result = (AtomicReference<Object>)method.invoke(null);
56 System.out.println(result.hashCode());
57 //System.out.println(result.get().hashCode());