अगर मैं निम्नलिखित दो वर्गों है:जावा 8 व्युत्पन्न कक्षाओं के लिए अलग-अलग टिप्पणियां क्यों लागू करता है?
// Base.java
public abstract class Base<T> {
abstract void method(T t);
}
और
// Derived.java
public class Derived extends Base<Number> {
@Deprecated
void method(Number n) {}
}
मैं तो javac Base.java Derived.java
के साथ उन्हें संकलन और उसके बाद javap -v Derived
का उपयोग करें। अगर मैं जावा 7 का उपयोग करें, मैं
public class Derived extends Base<java.lang.Number>
Signature: #17 // LBase<Ljava/lang/Number;>;
SourceFile: "Derived.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #5.#20 // Base."<init>":()V
#2 = Class #21 // java/lang/Number
#3 = Methodref #4.#22 // Derived.method:(Ljava/lang/Number;)V
#4 = Class #23 // Derived
#5 = Class #24 // Base
#6 = Utf8 <init>
#7 = Utf8 ()V
#8 = Utf8 Code
#9 = Utf8 LineNumberTable
#10 = Utf8 method
#11 = Utf8 (Ljava/lang/Number;)V
#12 = Utf8 Deprecated
#13 = Utf8 RuntimeVisibleAnnotations
#14 = Utf8 Ljava/lang/Deprecated;
#15 = Utf8 (Ljava/lang/Object;)V
#16 = Utf8 Signature
#17 = Utf8 LBase<Ljava/lang/Number;>;
#18 = Utf8 SourceFile
#19 = Utf8 Derived.java
#20 = NameAndType #6:#7 // "<init>":()V
#21 = Utf8 java/lang/Number
#22 = NameAndType #10:#11 // method:(Ljava/lang/Number;)V
#23 = Utf8 Derived
#24 = Utf8 Base
{
public Derived();
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method Base."<init>":()V
4: return
LineNumberTable:
line 1: 0
void method(java.lang.Number);
flags:
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 7: 0
Deprecated: true
RuntimeVisibleAnnotations:
0: #14()
void method(java.lang.Object);
flags: ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: aload_1
2: checkcast #2 // class java/lang/Number
5: invokevirtual #3 // Method method:(Ljava/lang/Number;)V
8: return
LineNumberTable:
line 1: 0
}
मिल रहा जावा 8 के साथ एक ही बात करते हैं, मैं बजाय
public class Derived extends Base<java.lang.Number>
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #5.#20 // Base."<init>":()V
#2 = Class #21 // java/lang/Number
#3 = Methodref #4.#22 // Derived.method:(Ljava/lang/Number;)V
#4 = Class #23 // Derived
#5 = Class #24 // Base
#6 = Utf8 <init>
#7 = Utf8 ()V
#8 = Utf8 Code
#9 = Utf8 LineNumberTable
#10 = Utf8 method
#11 = Utf8 (Ljava/lang/Number;)V
#12 = Utf8 Deprecated
#13 = Utf8 RuntimeVisibleAnnotations
#14 = Utf8 Ljava/lang/Deprecated;
#15 = Utf8 (Ljava/lang/Object;)V
#16 = Utf8 Signature
#17 = Utf8 LBase<Ljava/lang/Number;>;
#18 = Utf8 SourceFile
#19 = Utf8 Derived.java
#20 = NameAndType #6:#7 // "<init>":()V
#21 = Utf8 java/lang/Number
#22 = NameAndType #10:#11 // method:(Ljava/lang/Number;)V
#23 = Utf8 Derived
#24 = Utf8 Base
{
public Derived();
descriptor:()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method Base."<init>":()V
4: return
LineNumberTable:
line 1: 0
void method(java.lang.Number);
descriptor: (Ljava/lang/Number;)V
flags:
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 5: 0
Deprecated: true
RuntimeVisibleAnnotations:
0: #14()
void method(java.lang.Object);
descriptor: (Ljava/lang/Object;)V
flags: ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: aload_1
2: checkcast #2 // class java/lang/Number
5: invokevirtual #3 // Method method:(Ljava/lang/Number;)V
8: return
LineNumberTable:
line 1: 0
RuntimeVisibleAnnotations:
0: #14()
}
Signature: #17 // LBase<Ljava/lang/Number;>;
SourceFile: "Derived.java"
मिल यहाँ ध्यान देने योग्य बात यह है कि एक एनोटेशन void method(java.lang.Object)
पर दिखाई दे रहा है कि वहाँ है जावा 8 संस्करण में स्टब जो जावा 7 संस्करण में मौजूद नहीं है। यह सिर्फ javap
गलती नहीं कर रहा है - यदि आप रनटाइम पर मौजूद एनोटेशन की जांच करने के लिए प्रतिबिंब का उपयोग करते हैं, तो जावा 7 संस्करण में केवल void method(java.lang.Number)
पर एनोटेशन है और जावा 8 संस्करण दोनों पर है। क्या चल रहा है?
यह भी एक अविश्वसनीय रूप से कष्टप्रद व्यवहार परिवर्तन है। सूचक के लिए धन्यवाद। –