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]