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]
