2017-02-28 9 views
10

ऐसा लगता है कि TYPE_USE एनोटेशन प्रतिबिंब के माध्यम से पहुँचा नहीं जा सकता जब एनोटेट प्रकार एक नेस्टेड, जेनेरिक इंटरफेस है।TYPE_USE एनोटेशन जब प्रकार नीडिंत है खो जाना, सामान्य इंटरफ़ेस

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 
import java.lang.reflect.AnnotatedType; 
import java.lang.reflect.Method; 
import java.util.Arrays; 
import java.util.Map; 
import java.util.Map.Entry; 

public class LostAnnotation { 
    @Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.TYPE_USE) 
    public @interface SomeTypeAnnotation { 
    } 

    @SomeTypeAnnotation Map<String, String> map; 
    @SomeTypeAnnotation Entry<String, String> entry; 

    public static @SomeTypeAnnotation Entry<String, String> someMethod(
     @SomeTypeAnnotation Map<String, String> map, 
     @SomeTypeAnnotation Entry<String, String> entry) { 
    return null; 
    } 

    public static void main(String[] args) throws Exception { 
    Class<LostAnnotation> clazz = LostAnnotation.class; 
    Method method = clazz.getMethod("someMethod", Map.class, Entry.class); 
    AnnotatedType[] types = method.getAnnotatedParameterTypes(); 

    print("map field", clazz.getDeclaredField("map").getAnnotatedType()); 
    print("map parameter", types[0]); 

    print("entry field", clazz.getDeclaredField("entry").getAnnotatedType()); 
    print("entry parameter", types[1]); 
    print("entry return type", method.getAnnotatedReturnType()); 
    } 

    static void print(String title, AnnotatedType type) { 
    System.out.printf("%s: %s%n", title, Arrays.asList(type.getAnnotations())); 
    } 
} 

उम्मीद उपरोक्त कोड के उत्पादन में

map field: [@LostAnnotation$SomeTypeAnnotation()] 
map parameter: [@LostAnnotation$SomeTypeAnnotation()] 
entry field: [@LostAnnotation$SomeTypeAnnotation()] 
entry parameter: [@LostAnnotation$SomeTypeAnnotation()] 
entry return type: [@LostAnnotation$SomeTypeAnnotation()] 
हालांकि

, ऊपर कोड की वास्तविक उत्पादन है

map field: [@LostAnnotation$SomeTypeAnnotation()] 
map parameter: [@LostAnnotation$SomeTypeAnnotation()] 
entry field: [] 
entry parameter: [] 
entry return type: [] 
:

निम्न उदाहरण का पालन करें

एनोटेशन Map इंटरफ़ेस के प्रत्येक उपयोग से सही ढंग से पुनर्प्राप्त किया गया है। हालांकि, Entry इंटरफ़ेस के प्रत्येक उपयोग पर, यह फ़ील्ड, रिटर्न टाइप या पैरामीटर हो, एनोटेशन खो गया है। केवल स्पष्टीकरण मैं इस के लिए है कि Entry इंटरफ़ेस Map इंटरफेस के अंदर नेस्टेड जाता है।

मैं win64 पर नवीनतम ओरेकल JDK (8u121) पर ऊपर के उदाहरण भाग गया। क्या मैं कुछ गलत कर रहा हूं या यह एक बग हो सकता है?

मेरी व्याख्या पठनीयता के लिए नीडिंत है। इसे एक शीर्ष-स्तरीय इंटरफ़ेस बनाना कुछ भी नहीं बदलता है।

+2

मैं परीक्षण किया है और अपने कोड के साथ चारों ओर खेला और अपनी तरफ से अपने कोड में किसी भी त्रुटि नहीं मिल रहा। तो मैं क्रेगएक्स से सहमत हूं, यह सीम जेवीएम में एक बग बनने के लिए है। –

उत्तर

5

यह पहले से ही SO: Why annotation on generic type argument is not visible for nested type?

उत्तर बग प्रस्तुत किया गया है में लेकिन कम प्राथमिकता में देखा गया है उन मामलों में अक्सर दिखाई नहीं देते हैं।

फिर भी, आप बाइटकोड को पार्स करने के लिए ByteBuddy का उपयोग कर सकते हैं और एनोटेटेड प्रकार को पुनर्प्राप्त कर सकते हैं।

ASM मेरे अनुभव से भी काम करता है, और मुझे संदेह है कि किसी भी बाइटकोड पार्सर इस बग के आसपास काम करेगा।

0

मुझे नहीं पता कि मैं एक विश्वसनीय स्रोत (निश्चित रूप से एक आधिकारिक नहीं) के रूप में गिनता हूं, लेकिन आईएमओ यह एक बग है या कम से कम एक कमी (पूरी तरह कार्यान्वित नहीं) जेडीके में है।

आप कुछ भी गलत नहीं कर रहे हैं - या हम दोनों गलत हैं, जो अभी भी एक संभावना है।

के रूप में बर्ट्रेंड रसेल ने कहा:

तथ्य यह है कि एक राय व्यापक रूप से आयोजित किया गया है कोई सबूत नहीं है जो कुछ भी है कि यह पूरी तरह से बेतुका नहीं है।

;-)

संबंधित मुद्दे