<div dir="ltr"><div>Consider this class:</div><div style="margin-left:40px"><span style="font-family:monospace"><br></span></div><div><div style="margin-left:40px"><span style="font-family:monospace">import java.lang.annotation.*;</span><br><span style="font-family:monospace">public class InstancePat {</span><br><span style="font-family:monospace">    InstancePat(Object o) {</span><br><span style="font-family:monospace">        if (<span style="background-color:rgb(255,255,0)">o instanceof @Anno Runnable</span>) {</span><br><span style="font-family:monospace">            @Anno Runnable r = <span style="background-color:rgb(255,255,0)">(@Anno Runnable)</span>o;</span><br><span style="font-family:monospace">            System.out.println(r);</span><br><span style="font-family:monospace">        }</span><br><span style="font-family:monospace">    }</span><br><span style="font-family:monospace">    InstancePat(Object o, int x) {</span><br><span style="font-family:monospace">        if (<span style="background-color:rgb(249,203,156)">o instanceof @Anno Runnable r</span>)</span><br><span style="font-family:monospace">            System.out.println(r);</span><br><span style="font-family:monospace">    }</span><br><span style="font-family:monospace">}</span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace">@Retention(RetentionPolicy.RUNTIME)</span><br><span style="font-family:monospace">@Target(ElementType.TYPE_USE)</span><br><span style="font-family:monospace">@interface Anno { }</span><br><span style="font-family:monospace"></span></div><br></div><div>Here's the javap output (edited for brevity):</div><div><br></div><div><div style="margin-left:40px"><span style="font-family:monospace">  InstancePat(java.lang.Object);</span><br><span style="font-family:monospace">         0: aload_0</span><br><span style="font-family:monospace">         1: invokespecial #1                  // Method java/lang/Object."<init>":()V</span><br><span style="font-family:monospace">         4: aload_1</span><br><span style="font-family:monospace;background-color:rgb(255,255,0)">         5: instanceof    #7                  // class java/lang/Runnable</span><span style="background-color:rgb(255,255,0)"><br></span><span style="font-family:monospace">         8: ifeq          23</span><br><span style="font-family:monospace">        11: aload_1</span><br><span style="font-family:monospace;background-color:rgb(255,255,0)">        12: checkcast     #7                  // class java/lang/Runnable</span><br><span style="font-family:monospace">        15: astore_2</span><br><span style="font-family:monospace">        16: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;</span><br><span style="font-family:monospace">        19: aload_2</span><br><span style="font-family:monospace">        20: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V</span><br><span style="font-family:monospace">        23: return</span><br><span style="font-family:monospace">      RuntimeVisibleTypeAnnotations:</span><br><span style="font-family:monospace;background-color:rgb(255,255,0)">        0: #27(): INSTANCEOF, offset=5</span><span style="background-color:rgb(255,255,0)"><br><span style="font-family:monospace">          Anno</span><br><span style="font-family:monospace">        1: #27(): CAST, offset=12, type_index=0</span><br><span style="font-family:monospace">          Anno</span><br></span><span style="font-family:monospace">        2: #27(): LOCAL_VARIABLE, {start_pc=16, length=7, index=2}</span><br><span style="font-family:monospace">          Anno</span><br><span style="font-family:monospace"></span><br><span style="font-family:monospace">  InstancePat(java.lang.Object, int);</span><br><span style="font-family:monospace">         0: aload_0</span><br><span style="font-family:monospace">         1: invokespecial #1                  // Method java/lang/Object."<init>":()V</span><br><span style="font-family:monospace">         4: aload_1</span><br><span style="font-family:monospace;background-color:rgb(249,203,156)">         5: instanceof    #7                  // class java/lang/Runnable</span><br><span style="font-family:monospace">         8: ifeq          23</span><br><span style="font-family:monospace">        11: aload_1</span><br><span style="font-family:monospace;background-color:rgb(249,203,156)">        12: checkcast     #7                  // class java/lang/Runnable</span><br><span style="font-family:monospace">        15: astore_3</span><br><span style="font-family:monospace">        16: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;</span><br><span style="font-family:monospace">        19: aload_3</span><br><span style="font-family:monospace">        20: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V</span><br><span style="font-family:monospace">        23: return</span><br><span style="font-family:monospace">      RuntimeVisibleTypeAnnotations:</span><br><span style="font-family:monospace">        0: #27(): LOCAL_VARIABLE, {start_pc=16, length=7, index=3}</span><br><span style="font-family:monospace">          Anno</span><br><span style="font-family:monospace"></span></div><br></div><div>Note the<span style="font-family:monospace"> RuntimeVisibleTypeAnnotations</span> entries for INSTANCEOF and CAST have disappeared in the second constructor. Is this behavior expected?</div><div><br></div><div>This question is related to my previous one about CAST expressions... both questions ask about "holes" in the story being told by the classfile relating to where type annotations occurred in the original source.</div><div><br></div><div>Stepping back, what is the actual intent here? I had assumed that, given correct class files, a bytecode analysis tool should be able to "keep track of" every type annotation that existed in the original source code, but maybe I'm reading too much into things (I didn't witness the discussion that led to these classfile attributes). Thanks for any clarifications.</div><br><div>-Archie</div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">Archie L. Cobbs<br></div></div>