What I still dont understand is;

the string might be inlined, but the "import" still seems to be
visible in the bytecode. Shouldn't dependency:analyze consider this a
"usage" ?

Kristian


2015-11-25 10:31 GMT+01:00 Stephen Connolly <[email protected]>:
> Well here's a how do you do...
>
> If I compile BarMain.java with foo/Test2.java using a plain =42, I get:
>
> public class BarMain {
>
>   public BarMain();
>
>     Code:
>
>        0: aload_0
>
>        1: invokespecial #1                  // Method
> java/lang/Object."<init>":()V
>
>        4: return
>
>
>   public static void main(java.lang.String[]);
>
>     Code:
>
>        0: getstatic     #2                  // Field
> java/lang/System.out:Ljava/io/PrintStream;
>
>        3: ldc           #4                  // String AZ 42
>
>        5: invokevirtual #5                  // Method
> java/io/PrintStream.println:(Ljava/lang/String;)V
>
>        8: return
>
> }
>
>
> If I compile BarMain.java with foo/Test2.java using the prevent inlining =
> null!=null?0:42 I get:
>
> public class BarMain {
>
>   public BarMain();
>
>     Code:
>
>        0: aload_0
>
>        1: invokespecial #1                  // Method
> java/lang/Object."<init>":()V
>
>        4: return
>
>
>   public static void main(java.lang.String[]);
>
>     Code:
>
>        0: getstatic     #2                  // Field
> java/lang/System.out:Ljava/io/PrintStream;
>
>        3: new           #3                  // class java/lang/StringBuilder
>
>        6: dup
>
>        7: invokespecial #4                  // Method
> java/lang/StringBuilder."<init>":()V
>
>       10: ldc           #5                  // String AZ
>
>       12: invokevirtual #6                  // Method
> java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
>
>       15: getstatic     #7                  // Field foo/Test2.AZAZ:I
>
>       18: invokevirtual #8                  // Method
> java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
>
>       21: invokevirtual #9                  // Method
> java/lang/StringBuilder.toString:()Ljava/lang/String;
>
>       24: invokevirtual #10                 // Method
> java/io/PrintStream.println:(Ljava/lang/String;)V
>
>       27: return
>
> }
>
>
> So what I see there is that in the first case javac has inlined the
> constant and converted it to a string... in the second case it is
> referencing the field directly
>
>
>
> On 25 November 2015 at 08:53, Kristian Rosenvold <
> [email protected]> wrote:
>
>> Let me be more precise here; the dependency:analyze seems to miss a
>> whole group of references to static fields. Both static imports and
>> references to fields. In my code sample, I can do the following:
>>
>> javap -v bar/BarMain.class
>>
>> Classfile bar/BarMain.class
>>   Last modified 25.nov.2015; size 583 bytes
>>   MD5 checksum 02168be555cf779b31a4790f97b202a7
>>   Compiled from "BarMain.java"
>> public class bar.BarMain
>>   minor version: 0
>>   major version: 49
>>   flags: ACC_PUBLIC, ACC_SUPER
>> Constant pool:
>>    #1 = Class              #23            // foo/Main
>>    #2 = Methodref          #9.#24         // java/lang/Object."<init>":()V
>>    #3 = Fieldref           #25.#26        //
>> java/lang/System.out:Ljava/io/PrintStream;
>>    #4 = String             #27            // SC compile
>>    #5 = Methodref          #28.#29        //
>> java/io/PrintStream.println:(Ljava/lang/String;)V
>>    #6 = Class              #30            // foo/Test2
>>    #7 = String             #31            // AZ 42
>>    #8 = Class              #32            // bar/BarMain
>>    #9 = Class              #33            // java/lang/Object
>>   #10 = Utf8               <init>
>>   #11 = Utf8               ()V
>>   #12 = Utf8               Code
>>   #13 = Utf8               LineNumberTable
>>   #14 = Utf8               LocalVariableTable
>>   #15 = Utf8               this
>>   #16 = Utf8               Lbar/BarMain;
>>   #17 = Utf8               main
>>   #18 = Utf8               ([Ljava/lang/String;)V
>>   #19 = Utf8               args
>>   #20 = Utf8               [Ljava/lang/String;
>>   #21 = Utf8               SourceFile
>>   #22 = Utf8               BarMain.java
>>   #23 = Utf8               foo/Main
>>   #24 = NameAndType        #10:#11        // "<init>":()V
>>   #25 = Class              #34            // java/lang/System
>>   #26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;
>>   #27 = Utf8               SC compile
>>   #28 = Class              #37            // java/io/PrintStream
>>   #29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V
>>   #30 = Utf8               foo/Test2
>>   #31 = Utf8               AZ 42
>>   #32 = Utf8               bar/BarMain
>>   #33 = Utf8               java/lang/Object
>>   #34 = Utf8               java/lang/System
>>   #35 = Utf8               out
>>   #36 = Utf8               Ljava/io/PrintStream;
>>   #37 = Utf8               java/io/PrintStream
>>   #38 = Utf8               println
>>   #39 = Utf8               (Ljava/lang/String;)V
>> {
>>   public bar.BarMain();
>>     descriptor: ()V
>>     flags: ACC_PUBLIC
>>     Code:
>>       stack=1, locals=1, args_size=1
>>          0: aload_0
>>          1: invokespecial #2                  // Method
>> java/lang/Object."<init>":()V
>>          4: return
>>       LineNumberTable:
>>         line 25: 0
>>       LocalVariableTable:
>>         Start  Length  Slot  Name   Signature
>>             0       5     0  this   Lbar/BarMain;
>>
>>   public static void main(java.lang.String[]);
>>     descriptor: ([Ljava/lang/String;)V
>>     flags: ACC_PUBLIC, ACC_STATIC
>>     Code:
>>       stack=2, locals=1, args_size=1
>>          0: getstatic     #3                  // Field
>> java/lang/System.out:Ljava/io/PrintStream;
>>          3: ldc           #4                  // String SC compile
>>          5: invokevirtual #5                  // Method
>> java/io/PrintStream.println:(Ljava/lang/String;)V
>>          8: getstatic     #3                  // Field
>> java/lang/System.out:Ljava/io/PrintStream;
>>         11: ldc           #7                  // String AZ 42
>>         13: invokevirtual #5                  // Method
>> java/io/PrintStream.println:(Ljava/lang/String;)V
>>         16: return
>>       LineNumberTable:
>>         line 28: 0
>>         line 29: 8
>>         line 30: 16
>>       LocalVariableTable:
>>         Start  Length  Slot  Name   Signature
>>             0      17     0  args   [Ljava/lang/String;
>> }
>> SourceFile: "BarMain.java"
>>
>> As we can see the "import" class "foo/Test" is item #6/#30 and
>> referenced in the constant pool for the BarMain class. The dependency
>> analyzer does not seem to catch this. I'm a bit of a n00b in this
>> regard, anyone have any tips on how to do this ?
>>
>> Kristian
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to