can not use uninitialized object
mv.visitFieldInsn(GETSTATIC,"java/lang/System", "out", "Ljava/io/PrintStream;");
//stack: PrintStream
///Date date=new Date();
mv.visitTypeInsn(NEW, "java/util/Date");
//stack: uninitialized Date object
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/Object;)V");
//ERROR: Expecting to find object/array on stack
INVOKESPECIAL does not return a value
///Date date=new Date();
mv.visitTypeInsn(NEW, "java/util/Date");
mv.visitMethodInsn(INVOKESPECIAL, "java/util/Date", "<init>", "()V");
//stack: empty. <init> through INVOKESPECIAL does not return a value
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/Object;)V");
//ERROR: Unable to pop operand off an empty stack
hands on the new created object
mv.visitFieldInsn(GETSTATIC,"java/lang/System", "out", "Ljava/io/PrintStream;");
//stack: PrintStream
///Date date=new Date();
mv.visitTypeInsn(NEW, "java/util/Date");
mv.visitInsn(DUP);
// mv.visitVarInsn(ASTORE,1); //store the reference to be used later
mv.visitMethodInsn(INVOKESPECIAL, "java/util/Date", "<init>", "()V");
//stack: use one copy. another copy is in stack
// mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/Object;)V");