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]
>
>