Java VMと戯れてみる

J2SE 5.0の新機能
wikipedia:Java仮想マシン
言語仕様の限界にチャレンジする前に,言語使用と仲の悪くない実装を考えないと.


…ということで,とりあえずテスト.

public class CastTest<E>
{
	public Object i;
	public CastTest(E i)
	{
		this.i = i;
	}
	public void setI(E i)
	{
		this.i = i;
	}
	@SuppressWarnings("unchecked")
	public E getI()
	{
		return (E)i;
	}
	public static void main(String[] args)
	{
		Integer i0 = Integer.valueOf(1);
		Integer i1 = Integer.valueOf(100);
		Integer i2 = Integer.valueOf(10000);
		Integer i3 = Integer.valueOf(10000000);
		CastTest ct = new CastTest<Integer>(i0);
		System.out.println(ct.i);
		System.out.println(ct.getI());
	}
}

で,これをjavacしてjavap -c.

Compiled from "CastTest.java"
public class CastTest extends java.lang.Object{
public java.lang.Object i;

public CastTest(java.lang.Object);
  Code:
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	aload_0
   5:	aload_1
   6:	putfield	#2; //Field i:Ljava/lang/Object;
   9:	return

public void setI(java.lang.Object);
  Code:
   0:	aload_0
   1:	aload_1
   2:	putfield	#2; //Field i:Ljava/lang/Object;
   5:	return

public java.lang.Object getI();
  Code:
   0:	aload_0
   1:	getfield	#2; //Field i:Ljava/lang/Object;
   4:	areturn

public static void main(java.lang.String[]);
  Code:
   0:	iconst_1
   1:	invokestatic	#3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   4:	astore_1
   5:	bipush	100
   7:	invokestatic	#3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   10:	astore_2
   11:	sipush	10000
   14:	invokestatic	#3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   17:	astore_3
   18:	ldc	#4; //int 10000000
   20:	invokestatic	#3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   23:	astore	4
   25:	new	#5; //class CastTest
   28:	dup
   29:	aload_1
   30:	invokespecial	#6; //Method "<init>":(Ljava/lang/Object;)V
   33:	astore	5
   35:	getstatic	#7; //Field java/lang/System.out:Ljava/io/PrintStream;
   38:	aload	5
   40:	getfield	#2; //Field i:Ljava/lang/Object;
   43:	invokevirtual	#8; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   46:	getstatic	#7; //Field java/lang/System.out:Ljava/io/PrintStream;
   49:	aload	5
   51:	invokevirtual	#9; //Method getI:()Ljava/lang/Object;
   54:	invokevirtual	#8; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   57:	return

}
  • たしかにGenericsは跡形もない
  • やっぱりgetterを呼ぶよりもpublic fieldを直読みした方が速い?
  • JVM言語を作りたくなった.JavaCCとかANTLRとか使って