by Charles Miller on October 29, 2003

A while back, I wanted to demonstrate to somebody on a mailing-list that the restrictions of the Java programming language and those of the Java Virtual Machine were not the same thing. Namely, that reserved keywords in the Java language are not reserved by the JVM.

Hence: class.class is a Java class called, well, 'class'. It has a main method, so if you put it in a directory and run 'java class', it'll instantiate an instance of itself and print out that instance's getClass().getName().

I could have used a fancy Java assembler, but an existing class and a hex-editor was quicker. :)

Epiphany:~ cmiller$ java class
this object's class is: class

Epiphany:~ cmiller$ javap -c class
Compiled from
public class class extends java.lang.Object {
    public class();
    public static void main(java.lang.String[]);

Method class()
   0 aload_0
   1 invokespecial #9 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 new #2 <Class class>
   3 dup
   4 invokespecial #16 <Method class()>
   7 astore_1
   8 getstatic #22 <Field out>
  11 new #24 <Class java.lang.StringBuffer>
  14 dup
  15 ldc #26 <String "this object's class is: ">
  17 invokespecial #29 <Method 
  20 aload_1
  21 invokevirtual #33 <Method java.lang.Class getClass()>
  24 invokevirtual #39 <Method java.lang.String getName()>
  27 invokevirtual #43 <Method 
       java.lang.StringBuffer append(java.lang.String)>
  30 invokevirtual #46 <Method java.lang.String toString()>
  33 invokevirtual #51 <Method void println(java.lang.String)>
  36 return

Previously: Redhat Can Bite My Shiny Metal Ass

Next: struts-menu Permissions