On Wed, Jan 26, 2005 at 12:57:23PM -0700, Hiller, Dean D (Dean) wrote:
> I am a little confused on scanning for this
>   LDC "com.foobar.SomeClass"
>   INVOKESTATIC "java.lang.Class class$(java.lang.String)"
> 
> The closest thing I see is this
>          instr=aload_0[42](1)
>          instr=invokestatic[184](3) 1
> 
> I think I tried to get the type info from the aload_0 and failed.  How
> do I get aload_0, type info.

I don't think that is the instruction pair that gets the class
object.  In general, you need to perform a dataflow analysis
to find out what type of reference is stored in a local.
However, for non-static methods, aload_0 will almost certainly
load the "this" reference, which is of the type of the class
the method is in.

Here is what I see using javac from JDK 1.4.2_04 on the following
sample class:

public class GetClass {
        public Class c = GetClass.class;
}


Output from "javap -c -private GetClass":

Compiled from "GetClass.java"
public class GetClass extends java.lang.Object{
public java.lang.Class c;
 
static java.lang.Class class$GetClass;
 
public GetClass();
  Code:
   0:   aload_0
   1:   invokespecial   #6; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   getstatic       #7; //Field class$GetClass:Ljava/lang/Class;
   8:   ifnonnull       23
   11:  ldc     #8; //String GetClass
   13:  invokestatic    #9; //Method 
class$:(Ljava/lang/String;)Ljava/lang/Class;
   16:  dup
   17:  putstatic       #7; //Field class$GetClass:Ljava/lang/Class;
   20:  goto    26
   23:  getstatic       #7; //Field class$GetClass:Ljava/lang/Class;
   26:  putfield        #10; //Field c:Ljava/lang/Class;
   29:  return
 
static java.lang.Class class$(java.lang.String);
  Code:
   0:   aload_0
   1:   invokestatic    #1; //Method 
java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
   4:   areturn
   5:   astore_1
   6:   new     #3; //class NoClassDefFoundError
   9:   dup
   10:  aload_1
   11:  invokevirtual   #4; //Method 
java/lang/ClassNotFoundException.getMessage:()Ljava/lang/String;
   14:  invokespecial   #5; //Method 
java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V
   17:  athrow
  Exception table:
   from   to  target type
     0     4     5   Class java/lang/ClassNotFoundException

Bytecodes 11 and 13 in the constructor are the sequence I was
talking about.

You can also see a synthetic static field (class$GetClass) to cache
the Class object, and a synthetic static method (class$) which takes
a String object (class name), does the class lookup using Class.forName(),
and returns it.

In the code you posted:

      method=<init>
         method ret type=void
         instr=aload_0[42](1)
         instr=invokespecial[183](3) 6
         instr=aload_0[42](1)
         instr=getstatic[178](3) 7
         instr=ifnonnull[199](3) -> getstatic 7
         instr=ldc[18](2) 8
         instr=invokestatic[184](3) 9
         instr=dup[89](1)
         instr=putstatic[179](3) 7
         instr=goto[167](3) -> putfield 10
         instr=getstatic[178](3) 7
         instr=putfield[181](3) 10
         instr=return[177](1)

My guess is that the lines

         instr=ldc[18](2) 8
         instr=invokestatic[184](3) 9

are where the "class$" method is being called.  It's easier to
see using "javap -c", though, since that shows all of the symbolic
information like method names, signatures, constant values,
etc.

-Dave

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to