2016-10-10 7 views
5

मैं निम्नलिखित कोड का व्यवहार नहीं मिलता है: https://gist.github.com/tomaszalusky/3e3777b4fd0c6096f3f707bb19b50b52 - एम्बेडेड देखें:जेनेरिक प्रकार तर्क पर एनोटेशन नेस्टेड प्रकार के लिए क्यों दिखाई नहीं दे रहा है?

import java.lang.reflect.*; 
import java.util.*; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 


public class AnnotationOnTypeArgument { 

    @Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD,ElementType.TYPE_USE}) 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface Anno { 

    } 

    interface Nested<T> { 

    } 

    Toplevel<@Anno Integer> toplevel; 

    Nested<@Anno Integer> nested; 

    public static void main(String[] args) throws Exception { 
     print(AnnotationOnTypeArgument.class.getDeclaredField("toplevel")); 
     print(AnnotationOnTypeArgument.class.getDeclaredField("nested")); 
    } 

    private static void print(Field field) { 
     AnnotatedType annotatedType = field.getAnnotatedType(); 
     AnnotatedParameterizedType annotatedParameterizedType = (AnnotatedParameterizedType)annotatedType; 
     ParameterizedType parameterizedType = (ParameterizedType)annotatedParameterizedType.getType(); 
     AnnotatedType argType = annotatedParameterizedType.getAnnotatedActualTypeArguments()[0]; 
     System.out.printf("field %s%ntype=%s%nannotatedType=%s%nannotations=%s%ntype=%s%n%n", 
       field.getName(), parameterizedType, argType, Arrays.asList(argType.getDeclaredAnnotations()), argType.getType()); 
    } 

} 

interface Toplevel<T> { 

} 

संपादित करें: वास्तविक परिणाम है:

field toplevel 
type=Toplevel<java.lang.Integer> 
annotatedType=su[email protected]1540e19d 
annotations=[@AnnotationOnTypeArgument$Anno()] 
type=class java.lang.Integer 

field nested 
type=AnnotationOnTypeArgument.AnnotationOnTypeArgument$Nested<java.lang.Integer> 
annotatedType=su[email protected]677327b6 
annotations=[] 
type=class java.lang.Integer 

क्यों प्रकार तर्क पर घोषित एनोटेशन की सरणी है आसपास के प्रकार घोंसला जब खाली है? मैं शीर्ष स्तर के प्रकार के लिए एक तत्व होने की उम्मीद करता हूं। मैं जेएलएस के आधार पर किसी स्पष्टीकरण की सराहना करता हूं।

लगातार जेडीके 8u101 (http://compilejava.net), पुराने जेडीके 8 और ग्रहण पर होता है।

धन्यवाद!

उत्तर

5

मैं कुछ समय के डिबगिंग के लिए और annotatedParameterizedType चर लगता है अभी भी लेकिन वहाँ नेस्टेड मामले के लिए अपने allOnSameTargetTypeAnnotations क्षेत्र में ईसा एनोटेशन के संदर्भ में शामिल करने के लिए भी

annotatedParameterizedType = {[email protected]} 
type = {[email protected]} "com.sample.Toplevel<java.lang.Integer>" 
decl = {[email protected]} "com.sample.Toplevel com.sample.AnnotationOnTypeArgument.toplevel" 
location = {[email protected]} 
    depth = 0 
    locations = {TypeAnnotation$LocationInfo$Location[0]@549} 
allOnSameTargetTypeAnnotations = {TypeAnnotation[1]@544} 
    0 = {[email protected]} "@com.sample.AnnotationOnTypeArgument$Anno() with Targetnfo: FIELD: -2, -2 on base declaration: com.sample.Toplevel com.sample.AnnotationOnTypeArgument.toplevel" 
annotations = {[email protected]} size = 0 

बनाम

annotatedParameterizedType = {[email protected]} 
type = {[email protected]} "com.sample.AnnotationOnTypeArgument.com.sample.AnnotationOnTypeArgument$Nested<java.lang.Integer>" 
decl = {[email protected]} "com.sample.AnnotationOnTypeArgument$Nested com.sample.AnnotationOnTypeArgument.nested" 
location = {[email protected]} 
    depth = 1 
    locations = {TypeAnnotation$LocationInfo$Location[1]@611} 
allOnSameTargetTypeAnnotations = {TypeAnnotation[1]@607} 
    0 = {[email protected]} "@com.sample.AnnotationOnTypeArgument$Anno() with Targetnfo: FIELD: -2, -2 on base declaration: com.sample.AnnotationOnTypeArgument$Nested com.sample.AnnotationOnTypeArgument.nested" 
annotations = {[email protected]} size = 0 

दिया स्थान गहराई में एक अंतर है और आगामी getAnotatedActualTypeArguments() AnnotatedTypeFactory की विधि विधि में टाइप एन्नोटेशन .isSameLocationInfo() तुलना एनोटेशन में तत्व जोड़ने के लिए पूर्व शर्त के रूप में है नक्शा, जो घोंसले के मामले में झूठा हो जाएगा, इस प्रकार अंततः कोई तत्व जोड़ा नहीं जा रहा है

मुझे इसके बारे में कोई दस्तावेज नहीं मिला। शायद आपको यहां एक समस्या मिली है

+2

मुझे लगता है, हम इसे वापस [ 'AnnotatedTypeFactory' को ट्रेस कर सकते हैं , लाइन 105] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/reflect/annotation/AnnotatedTypeFactory.java#105) जहां नेस्टेड पैरामीट्रिज्ड प्रकार हैं बिना शर्त रूप से (गैर-'स्टेटिक') आंतरिक कक्षाओं (पुन: प्रयोज्य प्रकारों के विपरीत, सात पंक्तियों के विपरीत) के रूप में माना जाता है। असल में, 'पैरामैटर्ट्रिज्ड टाइप' पूछना चाहे वह 'स्थैतिक' है, सीधे आगे नहीं है ... – Holger

4

यह ओपनजेडीके में एक बग है, मैंने कुछ समय पहले इसकी सूचना दी है और मुझे उम्मीद है कि इसे ठीक किया जाएगा। एनोटेशन टाइप करें वास्तव में अभ्यास में उतना ही उपयोग नहीं किया जाता है और यह प्राथमिकता प्रतीत नहीं होता है। जैसा कि होल्गर ने उल्लेख किया है, यह AnnotatedTypeFactory के कार्यान्वयन में एक मिश्रण है।

public static void main(String[] args) throws Exception { 

    TypeDescription type = TypePool.Default.ofClassPath() 
     .describe(AnnotationOnTypeArgument.class.getName()) 
     .resolve(); 

    print(type.getDeclaredFields().filter(named("toplevel")).getOnly()); 
    print(type.getDeclaredFields().filter(named("nested")).getOnly()); 
} 

private static void print(FieldDescription field) { 
    System.out.printf("field %s%ntype=%s%nannotations=%s%ntype=%s%n%n", 
      field.getName(), 
      field.getType(), 
      field.getType().getTypeArguments().get(0), 
      field.getType().getTypeArguments().get(0).getDeclaredAnnotations()); 
} 

यह आपको अपेक्षित आउटपुट देता है::

आप Byte Buddy जो सही ढंग से वर्ग फ़ाइल मेटा डेटा पार्स करता है का उपयोग कर सकते

field toplevel 
type=net.bytebuddy.Toplevel<java.lang.Integer> 
annotations=class java.lang.Integer 
type=[@net.bytebuddy.AnnotationOnTypeArgument$Anno()] 

field nested 
type=net.bytebuddy.AnnotationOnTypeArgument.net.bytebuddy.AnnotationOnTypeArgument$Nested<java.lang.Integer> 
annotations=class java.lang.Integer 
type=[@net.bytebuddy.AnnotationOnTypeArgument$Anno()] 
+0

राफेल, आपका मतलब है कि बग पहले नहीं जानता था? और क्या आप कृपया रिपोर्ट की गई बग के यूआरएल निर्दिष्ट कर सकते हैं? ओरेकल बग डेटाबेस सर्च इंजन इस समय कुछ हद तक अस्वास्थ्यकर लगता है। –

+1

मैं इसे खोजने की कोशिश कर रहा था लेकिन मैं नहीं कर सका। मैंने इसे वेब फॉर्म के माध्यम से रिपोर्ट किया है, इसलिए मेरा नाम इस मुद्दे पर नहीं है। मैंने 20 बग्स की सूचना दी है जो एनोटेशन टाइप करने से संबंधित हैं, इसलिए यह अनौपचारिक, क्षमा करें। दुर्भाग्यवश, वे काफी छोटी हैं। यह रिपोर्ट अब तक लगभग एक वर्ष पुरानी होनी चाहिए। –

+1

हाय राफेल, क्या आप कृपया बग रिपोर्ट को फिर से ढूंढने का प्रयास कर सकते हैं? मैं यह पता लगाने की कोशिश कर रहा हूं कि मुझे [एक समान समस्या] के लिए एक रिपोर्ट दर्ज करनी चाहिए (http://stackoverflow.com/questions/42512701/type-use-annotations-get-lost-when-type-is-nested-generic -इंटरफेस)। – Tillerino

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